【问题标题】:how do i bring a multiline CSV file into single line如何将多行 CSV 文件放入单行
【发布时间】:2019-06-09 11:21:33
【问题描述】:

我需要解析具有最后一个多行列的 CSV 并将其转换为单行 CSV。

例子:

Name,Department,Team,Task
"Jack","QA","AF","He need to work
He needs to update
He needs to plan"
"Sam","Dev","Retail","He need to work
He needs to update
He needs to plan"

预期的结果是:

Name,Department,Team,Task
"Jack","QA","AF","He need to work.He needs to update.He needs to plan."
"Sam","Dev","Retail","He need to work.He needs to update.He needs to plan"

我需要为此使用 PowerShell。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 任务项的数量是否可预测?您的示例显示 3,但这可能只是巧合。
  • 不,最后一列是不可预测的。有时行数很少,有时会达到 62 行。
  • 任务本身是否可能包含逗号?
  • 逗号会让人困惑。相反,如果我们可以使用分号,那就太好了!

标签: powershell csv powershell-3.0


【解决方案1】:

啊,既然您已经引用了 CSV 值,这应该不会太难。

# I have faked the input using a here-string, but in real life, you should use
# $csv = Import-Csv -Path <PATH TO THE CSV FILE>

$csv = @"
Name,Department,Team,Task
"Jack","QA","AF","He need to work
He needs to update
He needs to plan"
"Sam","Dev","Retail","He need to work
He needs to update
He needs to plan"
"@ | ConvertFrom-Csv

# convert all newlines to a full-stop dot and replace multiple spaces in the Task field to become a single space character
$csv | ForEach-Object {
    $_.Task = $_.Task -replace '[\r?\n]+', '. ' -replace '\s{2,}', ' '
    # if you just want to 'normalize' whitespaces like a browser does, use this instead.
    # $_.Task = $_.Task -replace '\s+', ' '
}

现在$csv 变量保存了这些数据:

名称 部门 团队任务 ---- ---------- ---- ---- Jack QA AF 他需要工作。他需要更新。他需要计划 Sam Dev 零售 他需要工作。他需要更新。他需要计划

接下来,使用分号作为分隔符写入更新后的 CSV 文件

$csv | Export-Csv -Path '<PATH TO THE EXPORTED CSV FILE>' -NoTypeInformation -Delimiter ';'

希望有所帮助


编辑

根据您的评论,我了解更多列中可能包含换行符。 这是更新后的脚本,如果文件中包含换行符,它将把文件中的任何字段转换为单个字符串。

# Again, I have faked the input using a here-string, but in real life, you should use
# $csv = Import-Csv -Path <PATH TO THE CSV FILE>

$csv = @"
Name,Department,Team,Task
"Jack","QA","AF
XYZ","He need to work
He needs to update
He needs to plan"
"Sam","Dev","Retail
Sales","He need to work
He needs to update
He needs to plan"
"@ | ConvertFrom-Csv

# get an array of the header names
$headers = $csv[0].PSObject.Properties.name

$csv | ForEach-Object {
    foreach ($hdr in $headers) {
        # this regex converts all newlines to a full-stop dot and replaces multiple spaces to become one single space character
        $_.$hdr = $_.$hdr -replace '[\r?\n]+', '. ' -replace '\s{2,}', ' '
        # if you just want to 'normalize' all whitespaces like a browser does, use this instead.
        # $_.$hdr = $_.$hdr -replace '\s+', ' '
    }
}

之后,$csv 变量保存了这些数据:

Name Department Team          Task                                                 
---- ---------- ----          ----                                                 
Jack QA         AF. XYZ       He need to work. He needs to update. He needs to plan
Sam  Dev        Retail. Sales He need to work. He needs to update. He needs to plan

像往常一样导出到新的 CSV 文件:

$csv | Export-Csv -Path '<PATH TO THE EXPORTED CSV FILE>' -NoTypeInformation -Delimiter ';'

【讨论】:

  • 这确实有效。但是,我想检查一件事,如果我的 csv 的最后两列有多行怎么办?如果我的最后两列是多行的,你能帮我把脚本放在一行上吗
  • @AbhishekPandey 我已经编辑了我的答案,因此它将处理所有具有多行的字段。干杯!
猜你喜欢
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2019-10-16
  • 1970-01-01
  • 2020-10-05
相关资源
最近更新 更多