根据列值拆分 csv 文件

根据列值拆分 csv 文件

我有这个大型 csv(分号分隔)文件,我需要根据第二列的值将其拆分为大约 300 个文件(文件有标题名称)。该文件有大约 +300 万行和 54 列的标题。我曾尝试将此脚本与 Powershell 一起使用,但似乎无法运行。我可以在任务管理器中看到内存正在构建一段时间,但根本没有输出或错误消息。我在这里找到了这个脚本根据列值拆分 xlsx/csv 文件并根据我的需要更改脚本。我是否遗漏了某些内容,或者这个脚本有什么问题,导致没有执行任何输出...

缺什么?

$csv = Import-Csv C:\Data\Points\Se\Test\Data191017.csv -Delimiter ';'

$names = $csv | select -ExpandProperty OFFICENAME -Unique

foreach ($name in $names) { $csv | where {$_.name -like $name} | export-csv C:\Data\Points\Se\Test\20191028_$name.csv }

答案1

我终于让它工作了,我在导入和导出行都添加了 -Encoding(不确定是否需要)。现在它可以正确运行字符和所有内容,所以我很高兴 :)

感谢您的帮助并为我指明正确的方向,下面是适合我的目的的脚本......

$Source = 'Data_191107.csv'
$Dest = 'C:\temp\test\'
Import-Csv $Source -Delimiter ';' -Encoding 'ISO-8859-1' | %{
$_ | Export-csv -Path "$Dest$($_.OFFICENAME).csv" -Encoding 'ISO-8859-1' -NoTypeInformation -Delimiter ';' -Append
}

答案2

不是专家,但从我读过的内容来看,您需要避免中间变量,尤其是对于大型对象,并利用管道。以下内容适用于小样本:

$Source = 'C:\Data\Points\Se\Test\Data191017.csv'
$Dest = 'C:\Data\Points\Se\Test\'

Import-Csv $Source -Delimiter ';' | %{
   $_ | Export-csv -Path "$Dest$($_.OFFICENAME).csv" -NoTypeInformation -Delimiter ';' -Append
}

将参数分散开可以使其更易于阅读,但不确定对大型数据集的执行时间的影响:

$Source = 'C:\Data\Points\Se\Test\Data191017.csv'
$Dest = 'C:\Data\Points\Se\Test\'

Import-Csv $Source -Delimiter ';' | %{
   $splat = @{
      'Path'              = "$Dest$($_.Country).csv"
      'Delimiter'         = ';'
      'InputObject'       = $_
      'Append'            = $True
      'NoTypeInformation' = $True
   }
   Export-csv @splat
}

相关内容