重建 CSV 并为导出的文件名使用字段值
Rebuilding CSV and using a field value for the exported file name
我想从一行中读取一个字符串,然后将其放入一个变量中,该变量之后用作文件名。
该字符串位于第二行末尾的 .csv 文件中。由于不必要的标题,需要删除第一行。
还有';'旧 .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.
我已经在 google 上搜索了很多有关如何在 PowerShell 中初始化任何变量的信息,但仍然不清楚之后如何准确地声明它。我希望我在解决问题的正确道路上。非常感谢任何帮助。
您可以将 import-csv
与自定义 headers (-headers
) 结合使用,对于具有不同分隔符的 im/exporting,请使用 -delimiter
参数。
为了保存使用 export-csv -path $filename
(如果 $filename 已经是 .csv)或 export-csv -path $(".$filename.csv")
.
编辑:也许 post 输入文件的前 2(+) 行以获得改进的答案。
不清楚您对新输出文件中的 header 做了什么,但我想向您展示如何将您的文件转换为 CSV object 以使处理更容易。如果您计划在导出数据之前在 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。需要任意设置 header 才能正常工作,因此我们使用数字。为了获得结尾的逗号,我们添加了将列数增加一。 PowerShell 现在将为每一行创建一个空字段。导出时,您现在将有一个尾随逗号。
如果您不希望输出中的 header 也不难。将上面的最后一行更改为以下内容,您将获得没有 header.
的 CSV 数据
$csvData | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content "$($csvData[0].$maxHeaderIndex).csv"
我想从一行中读取一个字符串,然后将其放入一个变量中,该变量之后用作文件名。 该字符串位于第二行末尾的 .csv 文件中。由于不必要的标题,需要删除第一行。 还有';'旧 .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.
我已经在 google 上搜索了很多有关如何在 PowerShell 中初始化任何变量的信息,但仍然不清楚之后如何准确地声明它。我希望我在解决问题的正确道路上。非常感谢任何帮助。
您可以将 import-csv
与自定义 headers (-headers
) 结合使用,对于具有不同分隔符的 im/exporting,请使用 -delimiter
参数。
为了保存使用 export-csv -path $filename
(如果 $filename 已经是 .csv)或 export-csv -path $(".$filename.csv")
.
编辑:也许 post 输入文件的前 2(+) 行以获得改进的答案。
不清楚您对新输出文件中的 header 做了什么,但我想向您展示如何将您的文件转换为 CSV object 以使处理更容易。如果您计划在导出数据之前在 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。需要任意设置 header 才能正常工作,因此我们使用数字。为了获得结尾的逗号,我们添加了将列数增加一。 PowerShell 现在将为每一行创建一个空字段。导出时,您现在将有一个尾随逗号。
如果您不希望输出中的 header 也不难。将上面的最后一行更改为以下内容,您将获得没有 header.
的 CSV 数据$csvData | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content "$($csvData[0].$maxHeaderIndex).csv"