重建CSV并使用导出文件名的字段值

时间:2016-03-10 14:00:08

标签: csv powershell powershell-v2.0

我想从一行读取一个字符串,然后将其放入一个变量中,该变量后来被用作文件名。 该字符串位于第二行末尾的.csv文件中。由于不必要的标题,需要删除第一行。 还有&#39 ;;'旧的.csv文件中使用的文件需要用真正的逗号代替,'。 到目前为止,我已经获得了以下PowerShell脚本:

Powershell -command "(gc file1.csv | select -skip 1) -replace ';', ',' | Foreach-Object{ $_ + ',' } | Out-File file2.csv"

代码说明:

gc file1.csv | select -skip 1获取csv文件的内容。并从临时数组中删除第一行。

-replace ';', ','取代所有';'与','。

Foreach-Object{ $_ + ',' }在所有行的末尾添加逗号(这是必要的)。

Out-File file2.csv创建一个名为" file2.csv"的输出文件。

输入文件格式如下:( .csv的前两行)

  

123.256.862 ;; 0; 568.153.135; 12; 0 ;; 255.253.233

     

123.633.582 ;; 0; 568.588.533; 12; 0 ;; 255.253.233

脚本生成的输出文件如下:( .csv的前两行)

  

123.256.862,0,568.153.135,12,0,255.253.233,

     

123.633.582,0,568.588.533,12,0,255.253.233,

在PowerShell中编程时,下一个问题会出现:

  1. 如何将此代码编程为多行以便于阅读?

  2. 如何从第二行读取最后一个元素并将其放入变量?

  3. $Out-File $variable & '.csv'是否正确使用此变量作为名称生成新文件?我用虚拟变量尝试了这种方法,但它似乎没有用。更具体一点:新文件名必须为255.253.233.csv。

  4. 我已经搜索了很多关于如何在PowerShell中初始化任何变量的内容,但它仍然不清楚如何在之后准确地声明它。我希望我能找到正确的解决方案。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您可以将import-csv与自定义标头(-headers)一起使用,对于使用不同分隔符的im /导出,请使用-delimiter参数。 保存使用export-csv -path $filename(如果$ filename已经包含.csv)或export-csv -path $(".\$filename.csv")

编辑:也许发布输入文件的前2(+)行以获得改进的答案。

答案 1 :(得分:2)

目前尚不清楚您在新输出文件中使用标题做了什么,但我想向您展示如何将文件转换为CSV对象以使处理更容易。如果您计划在导出之前在PowerShell中对此数据执行任何其他操作,这将特别有用。

$path = "c:\temp\file1.csv"
# Drop the header which is apparently useless.
$content = Get-Content $path | Select-Object -Skip 1
# Figure out how many fields we have
$maxHeaderIndex = @([char[]]$content[0] -match ";").Length
# Convert the file into a csv object
$csvData = $content | ConvertFrom-Csv -Delimiter ";" -Header (0..($maxHeaderIndex + 1))
# Write this to file now.
$csvData | Export-Csv -NoTypeInformation -Path "$($csvData[0].$maxHeaderIndex).csv"

我使用多行,因为您似乎更喜欢那些可读性。这可以通过较少的线路轻松完成,但如果有效则无关紧要。

我们从文件中删除第一行,然后将其转换为CSV。需要为此设置一个任意标头,所以我们使用数字。为了得到尾随的逗号我们添加了一列的列数。 PowerShell现在将为每一行创建一个空字段。导出后,您将看到一个尾随逗号。

如果您不希望输出中的标头也不难。将上面的最后一行更改为以下内容,您将获得没有标题的CSV数据。

$csvData | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content "$($csvData[0].$maxHeaderIndex).csv"