清理格式不正确的csv文件

时间:2015-12-22 21:32:55

标签: powershell powershell-v3.0

我从sharepoint下载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 title-name。这就是产出......

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次?

2 个答案:

答案 0 :(得分:2)

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

注意 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

答案 1 :(得分:1)

尝试Import-csv时是否收到错误消息?该cmdlet非常智能,可以忽略没有标题的列,而无需任何其他代码。

我将你的csv文件复制到我的H:\ drive:

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