1

问:我想将 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的第一列是空的。第二列和第四列的文本是多行的,但在同一单元格中(同一行第 5 行)。

我尝试为每个对象导入 excel,然后用“,”替换换行符,最后使用(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 &amp            t
Row4#     04.06.01 test test          
Row5#     04.07.01 test test 
Row6#     04.10.02 test &amp         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

我已经尝试了很多来自 stackoverflow 的与此相关的问题,但由于某种原因,现有的解决方案似乎都不适合我。

附件是我要转换的示例 Excel 文件。测试.xlsx

4

1 回答 1

1

您的代码的问题是您指定了-NoHeader参数。
并且您必须在方法中指定`n而不是\n换行符Replace()

$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"

如果标题重复,则该-NoHeader参数是必需的。并在保存前删除自动附加的标题。

$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
于 2019-05-29T06:02:20.143 回答