PowerShell import-csv到数据库

时间:2015-05-22 11:41:51

标签: powershell csv

我想通过powershell将csv数据插入到访问数据库中。我使用下面的代码来插入数据。它成功执行但问题是它在数据库中插入空行。我不知道我在哪里弄错了。有什么想法吗?

    $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()

我犯错误的任何想法。

此致

丹麦

2 个答案:

答案 0 :(得分:1)

问题是由Powershell处理单'和双"引号引起的。根据{{​​3}},

  

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

     

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

因此,这句话

"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

答案 1 :(得分:0)

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

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

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

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