我想从一行读取一个字符串,然后将其放入一个变量中,该变量后来被用作文件名。 该字符串位于第二行末尾的.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中编程时,下一个问题会出现:
如何将此代码编程为多行以便于阅读?
如何从第二行读取最后一个元素并将其放入变量?
$Out-File $variable & '.csv'
是否正确使用此变量作为名称生成新文件?我用虚拟变量尝试了这种方法,但它似乎没有用。更具体一点:新文件名必须为255.253.233.csv。
我已经搜索了很多关于如何在PowerShell中初始化任何变量的内容,但它仍然不清楚如何在之后准确地声明它。我希望我能找到正确的解决方案。非常感谢任何帮助。
答案 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"