【问题标题】:cleanup improperly formatted csv file清理格式不正确的 csv 文件
【发布时间】:2015-12-23 08:29:03
【问题描述】:

我正在从共享点下载 xlsx 文件,然后将其转换为 csv 文件。但是,由于 xlsx 文件包含未删除的空列,因此它将这些列导出到 csv 文件,如下所示...

columnOne,columnTwo,columnThree,,,,
valueOne,,,,,,
,valueTwo,,,,,
,,valueThree,,,,

如您所见,Import-Csv cmdlet 将因该文件而失败,因为存在额外的空标题。我想知道如何计算末尾多余的逗号。列的数量一直在变化,列的名称也一直在变化。所以我们从最后一个非空标题号开始计数。

现在,我正在做以下事情......

$csvFileEdited = Get-Content $csvFile

$csvFileEdited[0] = $csvFileEdited[0].TrimEnd(',')

$csvFileEdited | Set-Content "$csvFile-temp"
Move-Item "$csvFile-temp" $csvFile -Force
Write-Host "Trim Complete."

这将使文件输出像这样......

columnOne,columnTwo,columnThree
valueOne,,,,,,
,valueTwo,,,,,
,,valueThree,,,,

Import-Csv 现在接受命名,但正如您所见,仍有多余的空值不是必需的,因为它们对于每一行都是空的。

如果我执行以下代码...

$csvFileWithExtraCommas = Get-Content $csvFile
$csvFileWithoutExtraCommas = @()

FOrEach ($line in $csvFileWithExtraCommas)
{
    $line = $line.TrimEnd(',')
    $csvFileWithoutExtraCommas += $line
{

$csvFileWithoutExtraCommas | Set-Content "$csvFile-temp"
Move-Item "$csvFile-temp" $csvFile -Force
Write-Host "Trim Complete."

然后它将删除一个应该为 null 的 null 值,因为它属于非 null 标题名称。这就是输出......

columnOne,columnTwo,columnThree
valueOne
,valueTwo
,,valueThree

这是所需的输出:

columnOne,columnTwo,columnThree
valueOne,,
,valueTwo,
,,valueThree

有人可以帮忙吗?

更新

我正在使用以下代码来计算额外的空标题...

$csvFileWithCommas = Get-Content $csvFile

[int]$csvFileWithExtraCommasNumber = $csvFileWithCommas[0].Length

$csvFileTitlesWithoutExtraCommas = $csvFileWithCommas[0].TrimEnd(',')

[int]$csvFileWithoutExtraCommasNumber = $csvFileTitlesWithoutExtraCommas.Length

$numOfCommas = $csvFileWithExtraCommasNumber - $csvFileWithoutExtraCommasNumber

$numOfCommas 的值的输出是4。现在的问题是我怎样才能使用 $line.TrimEnd(',') 只这样做 4 次??

【问题讨论】:

  • @SemihOzmen 据我所知,OP 表现出了努力和相当不错的 MCVE。

标签: powershell powershell-3.0


【解决方案1】:

好的....如果您真的需要这样做,您可以计算标题中的尾随逗号,并使用正则表达式从每行末尾删除尽可能多的逗号。还有其他字符串操作方法,但这种情况下的正则表达式非常干净。

注意Bluecakes answer 显示的内容应该足够了。也许还有一些其他隐藏字符没有在问题中被复制,或者可能是您的真实文件的编码问题。

$file = Get-Content "D:\temp\text.csv"
# Number of trailing commas. Compare the length before and after the trim
$numberofcommas = $file[0].Length - $file[0].TrimEnd(",").Length
# Use regex to remove as many commas from the end of each line and convert to csv object.
$file -replace ",{$numberofcommas}$" | ConvertFrom-Csv

正则表达式在 X 为 $numberofcommas 的每行末尾查找 X 逗号。在我们的例子中,它看起来像 ,{4}$


上面代码使用的源文件就是这样生成的

@"
columnOne,columnTwo,columnThree,,,,
valueOne,,,,,,
,valueTwo,,,,,
,,valueThree,,,,
"@ | set-content D:\temp\text.csv

【讨论】:

  • 这个接缝更合乎逻辑,我不熟悉 convertfrom-csv,它会给出错误,但如果$file -replace ",{$numberofcommas}$" 正确,我想我可以稍微改变一下。我会在稍后确认答案。提前感谢您的宝贵时间。
  • 如果重要的话,我正在使用 PowerShell v4,但不应该这样做。还要用你在问题中使用的数据进行测试,看看逻辑是否成立。可能是一些我们看不到的额外字符。如果您遇到错误,很高兴知道它们是什么。
  • 是的,它工作正常,只需将代码中的最后一行更改为 $file = $file -replace ",{$numberofcommas}$" 和 $file | Set-Content "$file-temp.csv"。根据需要从每一行中删除 4 个逗号。非常感谢:D
  • 我认为这意味着($file -replace ",{$numberofcommas}$") | ConvertFrom-Csv 会起作用。 @FiddleFreak
  • 是的,它成功了 :) 混合 get-content 和 import-csv 很棘手,所以我必须将这些 cmdlet 分开 :)
【解决方案2】:

您在尝试Import-csv 时是否遇到错误?该 cmdlet 足够智能,可以忽略没有标题的列,而无需任何额外代码。

我将您的 csv 文件复制到我的 H:\ 驱动器:

columnOne,columnTwo,columnThree,,,,
valueOne,,,,,,
,valueTwo,,,,,
,,valueThree,,,,

然后运行$nullcsv = Import-Csv -Path H:\nullcsv.csv,这就是我得到的

PS> $nullcsv

columnOne columnTwo columnThree
--------- --------- -----------
valueOne
          valueTwo
                    valueThree

如您所料,导入的 csv 仅包含 3 个值:

PS> $nullcsv.count
3

该 cmdlet 还正确地考虑了每一列中的空值:

PS> $nullcsv | Format-List

columnOne   : valueOne
columnTwo   :
columnThree :

columnOne   :
columnTwo   : valueTwo
columnThree :

columnOne   :
columnTwo   :
columnThree : valueThree

【讨论】:

  • 这也是我的发现。
  • 是的,我收到一个错误Cannot process argument because the value of argument "name" is invalid. 我找到了一种计算逗号的方法,现在我只需要知道如何将该计数应用于TrimEnd
  • @FiddleFreak 这是您在问题中遇到的测试数据错误吗?
  • 是的,我还发现人们遇到相同错误的文章,他们不得不删除空标题(他们手动执行此操作)。我的脚本应该自动执行此操作,这就是我想要弄清楚的。我用一些额外的发现更新了这个问题。顺便说一句,你用的是什么 ps 版本的 Bluecakes?
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 2021-09-15
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多