用于处理 excel 单元格中的多行数据并使用 Import-excel 或 Import-csv 转换为 csv 的 Powershell 脚本
Powershell script to handle multi line data in excel cell and convert to csv using Import-excel or Import-csv
问:我想将 excel 转换为 csv,但 excel 在一个单元格中包含多行数据以及“;”作为分隔符。所需的输出是带有“|”的 csv 文件作为列的分隔符,但“,”作为同一单元格内数据的分隔符。我不能使用 excel 因此我正在使用模块 "ImportExcel".
输入Excel格式(问题末尾的附件):-
Row1# c1# c2# c3# c4#
Row2#
Row3#
Row4# HEADER1 HEADER2 HEADER3
Row5# 04.05 test & t test TEST
Row5# 04.06.01 test test TEST
Row5# 04.07.01 test test
Row5# 04.10.02 test & t
Row# 表示 excel 的行,c# 表示列,而 HEADER# 表示列的标题。可以看出,第 1-3 行和 excel 的第一列是空的。第二列和第四列的文本是多行的,但在同一单元格中(同一行Row5)。
我尝试导入 excel 然后为每个 object 并用“,”替换换行符,最后使用(export-csv)和“|”将其导出到 csv作为分隔符。
我制作的脚本如下:-
$test = Import-excel -NoHeader -StartRow(4) test.xlsx
$test | foreach-object {
if($_.HEADER1) {
$_.HEADER1 = $_.HEADER1.replace("\n",", ")
$_.HEADER1 = $_.HEADER1.replace("&","& ")
}
}
$test | Export-csv new-test.csv -Delimiter '|' -NoTypeInformation
输出我得到的 CSV 文件 :-
Row1# c1# c2# c3#
Row2# HEADER1|HEADER2|HEADER3
Row3# 04.05 test & t
Row4# 04.06.01 test test
Row5# 04.07.01 test test
Row6# 04.10.02 test & t
Row7# test|TEST
Row8# TEST
可以看出,分隔符“;”之后的文字在输入中转到另一列,多行仍被解析为单独的行。我希望将所有这些多行合并为一个,以“,”作为分隔符以及“';”之后的文本分隔符。
所需的 CSV 文件:-
Row1# c1# c2#
Row2# HEADER1|HEADER2|HEADER3
Row3# 04.05 test & t,04.06.01 test test,04.07.01 test test,04.10.02 test & t|test|TEST,TEST
我已经尝试了很多来自 Whosebug 的与此相关的问题,但出于某种原因,现有解决方案的 none 似乎对我有用。
附件是我尝试转换的示例 Excel 文件。 test.xlsx
您的代码存在问题,因为您指定了 -NoHeader
参数。
并且您必须在 Replace()
方法中指定 `n
而不是 \n
作为换行符。
$test = Import-Excel test.xlsx -StartRow 4
$test | ForEach-Object {
if($_.HEADER1) {
$_.HEADER1 = $_.HEADER1.Replace("`n", ", ")
$_.HEADER1 = $_.HEADER1.Replace("&", "&")
}
if($_.HEADER3) {
$_.HEADER3 = $_.HEADER3.Replace("`n", ", ")
}
}
$test | Export-Csv new-test.csv -Delimiter "|" -NoTypeInformation
输出:
"HEADER1"|"HEADER2"|"HEADER3"
"04.05 test & t, 04.06.01 test test, 04.10.02 test & t, 04.07.01 test test"|"test"|"TEST, TEST"
使用 $obj.psobject.Properties
属性 替换所有属性的值很有用。
# import
$data = Import-Excel test.xlsx -StartRow 4
# replace the values of all properties
$data | ForEach-Object { $_.psobject.Properties } | Where-Object Value -is string |
ForEach-Object { $_.Value = $_.Value.Replace("`n",", ").Replace("&", "&") }
# export
$data | Export-Csv new-test.csv -Delimiter "|" -NoTypeInformation
如果要插入空行和空列,按ConvertTo-CSV
转换后添加。
$data | ConvertTo-Csv -Delimiter "|" -NoTypeInformation | ForEach-Object { "" } { "|" + $_ } | Out-File new-test.csv
输出:
|"HEADER1"|"HEADER2"|"HEADER3"
|"04.05 test & t, 04.06.01 test test, 04.10.02 test & t, 04.07.01 test test"|"test"|"TEST, TEST"
如果headers重复,则需要-NoHeader
参数。并在保存前删除自动附加的headers。
$data = Import-Excel test.xlsx -StartRow 4 -StartColumn 2 -NoHeader
$data | foreach { $_.psobject.Properties } | where Value -is string | foreach { $_.Value = $_.Value.Replace("`n",", ").Replace("&", "&") }
$data | ConvertTo-Csv -Delimiter "|" -NoTypeInformation | Select-Object -Skip 1 | Out-File new-test.csv
问:我想将 excel 转换为 csv,但 excel 在一个单元格中包含多行数据以及“;”作为分隔符。所需的输出是带有“|”的 csv 文件作为列的分隔符,但“,”作为同一单元格内数据的分隔符。我不能使用 excel 因此我正在使用模块 "ImportExcel".
输入Excel格式(问题末尾的附件):-
Row1# c1# c2# c3# c4#
Row2#
Row3#
Row4# HEADER1 HEADER2 HEADER3
Row5# 04.05 test & t test TEST
Row5# 04.06.01 test test TEST
Row5# 04.07.01 test test
Row5# 04.10.02 test & t
Row# 表示 excel 的行,c# 表示列,而 HEADER# 表示列的标题。可以看出,第 1-3 行和 excel 的第一列是空的。第二列和第四列的文本是多行的,但在同一单元格中(同一行Row5)。
我尝试导入 excel 然后为每个 object 并用“,”替换换行符,最后使用(export-csv)和“|”将其导出到 csv作为分隔符。
我制作的脚本如下:-
$test = Import-excel -NoHeader -StartRow(4) test.xlsx
$test | foreach-object {
if($_.HEADER1) {
$_.HEADER1 = $_.HEADER1.replace("\n",", ")
$_.HEADER1 = $_.HEADER1.replace("&","& ")
}
}
$test | Export-csv new-test.csv -Delimiter '|' -NoTypeInformation
输出我得到的 CSV 文件 :-
Row1# c1# c2# c3#
Row2# HEADER1|HEADER2|HEADER3
Row3# 04.05 test & t
Row4# 04.06.01 test test
Row5# 04.07.01 test test
Row6# 04.10.02 test & t
Row7# test|TEST
Row8# TEST
可以看出,分隔符“;”之后的文字在输入中转到另一列,多行仍被解析为单独的行。我希望将所有这些多行合并为一个,以“,”作为分隔符以及“';”之后的文本分隔符。
所需的 CSV 文件:-
Row1# c1# c2#
Row2# HEADER1|HEADER2|HEADER3
Row3# 04.05 test & t,04.06.01 test test,04.07.01 test test,04.10.02 test & t|test|TEST,TEST
我已经尝试了很多来自 Whosebug 的与此相关的问题,但出于某种原因,现有解决方案的 none 似乎对我有用。
附件是我尝试转换的示例 Excel 文件。 test.xlsx
您的代码存在问题,因为您指定了 -NoHeader
参数。
并且您必须在 Replace()
方法中指定 `n
而不是 \n
作为换行符。
$test = Import-Excel test.xlsx -StartRow 4
$test | ForEach-Object {
if($_.HEADER1) {
$_.HEADER1 = $_.HEADER1.Replace("`n", ", ")
$_.HEADER1 = $_.HEADER1.Replace("&", "&")
}
if($_.HEADER3) {
$_.HEADER3 = $_.HEADER3.Replace("`n", ", ")
}
}
$test | Export-Csv new-test.csv -Delimiter "|" -NoTypeInformation
输出:
"HEADER1"|"HEADER2"|"HEADER3"
"04.05 test & t, 04.06.01 test test, 04.10.02 test & t, 04.07.01 test test"|"test"|"TEST, TEST"
使用 $obj.psobject.Properties
属性 替换所有属性的值很有用。
# import
$data = Import-Excel test.xlsx -StartRow 4
# replace the values of all properties
$data | ForEach-Object { $_.psobject.Properties } | Where-Object Value -is string |
ForEach-Object { $_.Value = $_.Value.Replace("`n",", ").Replace("&", "&") }
# export
$data | Export-Csv new-test.csv -Delimiter "|" -NoTypeInformation
如果要插入空行和空列,按ConvertTo-CSV
转换后添加。
$data | ConvertTo-Csv -Delimiter "|" -NoTypeInformation | ForEach-Object { "" } { "|" + $_ } | Out-File new-test.csv
输出:
|"HEADER1"|"HEADER2"|"HEADER3"
|"04.05 test & t, 04.06.01 test test, 04.10.02 test & t, 04.07.01 test test"|"test"|"TEST, TEST"
如果headers重复,则需要-NoHeader
参数。并在保存前删除自动附加的headers。
$data = Import-Excel test.xlsx -StartRow 4 -StartColumn 2 -NoHeader
$data | foreach { $_.psobject.Properties } | where Value -is string | foreach { $_.Value = $_.Value.Replace("`n",", ").Replace("&", "&") }
$data | ConvertTo-Csv -Delimiter "|" -NoTypeInformation | Select-Object -Skip 1 | Out-File new-test.csv