将数据附加到管道分隔文件

时间:2014-01-03 16:27:46

标签: batch-file powershell pipe delimiter

我有一个包含5列的竖线分隔文件。我需要在每行的末尾添加第六个(管道分隔的)列。

旧数据:

a|b|c|d|e
p|q|r|s|t

新数据:

a|b|c|d|e|x
p|q|r|s|t|x

第六列(x)是从文本文件中读取的值。

我想知道是否有一种快速方法可以使用PowerShell将此数据附加到现有数据文件中?该文件包含可变行数(介于10到100,000之间)

感谢任何帮助

3 个答案:

答案 0 :(得分:1)

假设您的数据已经没有CSV中的任何标头,那么您必须使用-Headers cmdlet的Import-Csv参数定义标头。要运行下面的示例,请将数据放入名为c:\test\test.csv的文件中。然后,在PowerShell或PowerShell ISE中运行该脚本。

# 1. Import the data
$Data = Import-Csv -Delimiter '|' -Path c:\test\test.csv -Header prop1,prop2,prop3,prop4,prop5;

# 2. Add a new member to each row
foreach ($Item in $Data) {
    Add-Member -InputObject $Item -MemberType NoteProperty -Name prop6 -Value x;
}

# 3. Export the data to a new CSV file
$Data | Export-Csv -Delimiter '|' -Path c:\test\test.new.csv -NoTypeInformation;

# 4. Remove the double quotes around values
(Get-Content -Path c:\test\test.new.csv -Raw) -replace '"','' | Set-Content -Path c:\test\test.new.csv;

原始数据

c:\test\test.csv中的源数据应如下所示(根据您的原始帖子):

a|b|c|d|e
p|q|r|s|t

产生的数据

执行脚本后,c:\test\test.new.csv中的结果数据将如下所示:

prop1|prop2|prop3|prop4|prop5|prop6
a|b|c|d|e|x
p|q|r|s|t|x

随机样本数据生成

这是一个简短的脚本,它将为c:\test\test.csv生成10,000行随机样本文件:

$Random = { [System.Text.ASCIIEncoding]::ASCII.GetString((1..5 | % { [byte](Get-Random -Minimum 97 -Maximum 122); })).ToCharArray(); };
1..10000 | % { @('{0}|{1}|{2}|{3}|{4}' -f (& $Random)) } | Set-Content -Path c:\test\test.csv;

针对此示例数据( 10,000 行)运行我的第一个脚本后,结果为: 1,729 毫秒执行。我会说这很快。并不是说这是一场比赛或其他什么。

我再次运行示例文件生成器,以生成 100,000 行数据。在针对该数据运行相同的脚本之后,运行 19,784 毫秒。它大致与10,000线测试成比例,但总而言之,仍然没有那么长时间。这是一次性的事情,还是需要按计划运行?

答案 1 :(得分:1)

简单的文本操作应该有效:

$replace = 'x'

(Get-Content file.txt) -replace '$',"|$replace"

a|b|c|d|e|x
p|q|r|s|t|x

对于大文件,您可以这样做:

$replace = 'x'
filter add-data {$_ -replace '$',"|$replace"}
Get-Content file.txt -ReadCount 1000  | add-data | add-content newfile.txt

对于大文件,这应该会产生非常好的性能。

答案 2 :(得分:0)

您可以遍历文件行以获取行,只需在循环中附加值:

编辑完整的示例代码:

function append{
process{
foreach-object {$_ + "|x"}}}
$a = get-content yourcsv.csv
$a | append | set-content yourcsv.csv