【问题标题】:csv import null value powershell scriptcsv导入空值powershell脚本
【发布时间】:2020-07-30 12:41:13
【问题描述】:

我创建了一个名为 KS_Invoicing 的表,但是以下 powershell 脚本不允许我导入 NULL 值。任何想法为什么?

$database = 'Database'
$server = '192.168.1.1'
$table = 'KS_Invoicing'
$path = '\\hmks01\c$\temp\'

$CSVs = get-childitem $path -Filter *.csv
foreach ($c in $CSVs){

Import-CSV $path$c | ForEach-Object { 
$_.PSObject.Properties | Foreach-Object {$_.Value = $_.Value.Trim()} 

$column1= $_."Column One" 

if ($column1) {

$query= "insert into "+$table+" VALUES ('"+$column1+"')"  

Invoke-Sqlcmd -Database $database -ServerInstance $server -Query $query -U ks  -Password ks2020
}

}
Move-Item $path$c "\\hmks01\c$\temp\Archive"
}

【问题讨论】:

  • 无法将值“”转换为类型“System.DateTime”。错误:“字符串未被识别为有效的日期时间。”在 line:12 char:1 + $column1= $_."Column One" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException + FullyQualifiedErrorId : RuntimeException
  • 我看不出System.DateTime 来自哪里。您是在新的 Powershell 会话中执行代码还是之前使用过一些变量?在我看来,$_."Column One" 是一个空字符串("" 不是 $NULL),$column1 的类型是 System.DateTime...
  • 它是一个新的 powershell 窗口。我以前使用过以下内容,但是当 .csv 文件中的单元格为空白时,似乎不起作用 $column1= $_."Column One" -replace '[ ](?=[ ])|[^-,A-Za-z0-9 ]+' for datetime $column1= $."Column One" -replace '[^\p{L}\p{Nd}///}/_] ', ''
  • 很高兴有人帮我创建了一个新的 .ps 脚本。基本上 .csv 可能有包含空白数据(空值)的列。在数据库表中,该列设置为 Allow Nulls
  • 您没有显示 CSV 的配置方式。 Import-Csv 确实允许导入具有空字段的行。这是一个常见的现象。我刚刚创建了一个 3 列 3 行的示例文件,第 2 列是空的,可以正常导入。

标签: powershell null ssms import-csv


【解决方案1】:

根据我的第一条评论。导入空值按预期工作。

'Field1,Field2,Field3
Row1Field1Data,,Row1Field3Data
Row2Field1Data,,Row2Field3Data
Row3Field1Data,,Row3Field3Data' | 
Out-FIle -FilePath 'D:\Temp\EmptyFields.csv'

psEdit 'D:\Temp\EmptyFields.csv'
# Results
<#
Field1,Field2,Field3
Row1Field1Data,,Row1Field3Data
Row2Field1Data,,Row2Field3Data
Row3Field1Data,,Row3Field3Data
#>

Import-Csv -Path 'D:\Temp\EmptyFields.csv'
# Results
<#
Field1         Field2 Field3        
------         ------ ------        
Row1Field1Data        Row1Field3Data
Row2Field1Data        Row2Field3Data
Row3Field1Data        Row3Field3Data
#>

【讨论】:

    【解决方案2】:

    除了之前的回复。如果要导入 NULL 值,则必须遵循以下语法: https://www.w3resource.com/sql/insert-statement/insert-null.php

    因此,您必须检测 csv 中的空值并替换为“NULL”。

    $csv = 'Column One,Column Two,Column Three
    Row1Field1Data,,Row1Field3Data
    ,Row1Field2Data,Row2Field3Data
    Row3Field1Data,,Row3Field3Data'  | ConvertFrom-Csv
    $table = 'KS_Invoicing'
    foreach($line in $csv){
        $values = $line.PSObject.Properties.Value 
        $values | Foreach-Object {$_ = $_.Trim()} 
    
        $tab = foreach($v in $values)
        {
            if($v -eq ""){'NULL'}
            else{"`"$v`""}
        }
        "insert into $table VALUES ($($tab -join ','))"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多