【问题标题】:PowerShell import-csv to databasePowerShell 导入 csv 到数据库
【发布时间】:2015-05-22 11:41:50
【问题描述】:

我想通过 powershell 将 csv 数据插入到 access 数据库中。我使用下面的代码插入数据。它执行成功,但问题是它在数据库中插入空白行。我不确定我在哪里犯错。有什么想法吗?

    $datafile='my_file.xls'
$dbfile='C:\CSVtoAccess\TestDatabase.accdb'
$connectionString="Provider=Microsoft.Ace.OLEDB.12.0; Data Source=$dbfile"
$conn = New-Object System.Data.OleDb.OleDbConnection($connectionString)
$conn.Open()
$cmd = $Conn.CreateCommand()
Import-Csv $dataFile | 
     ForEach{
         $cmd.CommandText = "INSERT INTO CSVDATA2(F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,F13,F14,F15,F16,F17,F18,F19,F20,F21,F22,F23,F24,F25,F26) VALUES ('$($_.col1)', '$($_.col2)', '$($_.col3)', '$($_.col4)', '$($_.col5)', '$($_.col6)', '$($_.col7)', '$($_.col8)', '$($_.col9)', '$($_.col10)', '$($_.col11)', '$($_.col12)', '$($_.col13)', '$($_.col14)', '$($_.col15)', '$($_.col16)', '$($_.col17)', '$($_.col18)', '$($_.col19)', '$($_.col20)', '$($_.col21)', '$($_.col22)', '$($_.col23)', '$($_.col24)', '$($_.col25)', '$($_.col26)')"
         $cmd.ExecuteNonQuery()
     }
$conn.Close()

任何我犯错误的想法。

问候,

丹麦语

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    这个问题是由 Powershell 对单 ' 和双 " 引号的处理引起的。根据documentation

    当您将字符串括在双引号中时(双引号 字符串),以美元符号 ($) 开头的变量名是 在将字符串传递给之前替换为变量的值 处理命令。

    当您将字符串括在单引号中时(单引号 string) 时,字符串会完全按照您键入的方式传递给命令。 不执行替换。

    因此,这句话

    "INSERT INTO CSVDATA2(F1,F2,F3...) VALUES ('$($_.col1)', '$($_.col2)', '$($_.col3)'...)"
    

    不会将任何$($_.coln) 扩展为值。

    使用 Powershells -f 字符串格式,像这样

    $cmd.CommandText = "insert into foo(bar, zof) values ('{0}', '{1}')" -f $_.col1, $_.col2
    

    【讨论】:

    • 您好,感谢您的回复。现在,当我重写 sql.Error 格式化字符串时出现以下错误:索引(从零开始)必须大于或等于零并且小于参数列表的大小..
    • 格式化字符串时出错:索引(从零开始)必须大于或等于零且小于参数列表的大小。不知道我在哪里犯错了
    • 谢谢。我得到了我所缺少的。但它仍然没有得到价值。 sql 有一个空值。 $_.col 不工作。我不知道为什么。
    • 这很有帮助。我做了一些修改,解决方案对我有用。这里是修改 $userobjects=Import-Csv $dataFile ForEach ( $userobject in $userobjects ) { #$sqlcmd="INSERT INTO TEST3(id,name,DOB,sex) VALUES ('{0}', '{1} ', '{2}', '{3}')" -f $userobject.id, $userobject.name, $userobject.DOB, $userobject.SEX $cmd.CommandText = $sqlcmd $cmd.ExecuteNonQuery() } $conn.Close()
    【解决方案2】:

    您的输入文件是 excel 电子表格吗?如果是这样,您不应该使用 import-csv 来阅读它。有两种解决方法:

    1. 在 Excel 中,将文件另存为 csv 文件(文件扩展名为 .csv)而不是电子表格。

    2. MS Access 可以直接从 XLS 电子表格加载数据。我知道如何在 Access 中以交互方式执行此操作,但我不知道如何让 powershell 设置命令以供 Access 执行。也许其他响应者可以填写这篇文章。

    另外请注意,关于单引号和双引号的其他响应也是解决方案的一部分。

    【讨论】:

    • 文件是 csv 我特意放了 .xls 扩展名。
    • 以标准方式使用标准扩展是个好主意。如果是 cvs 文件,最好给它 .csv 扩展名。但是,这不会影响您现在遇到的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-09-20
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多