无法在Powershell中将字符数组写入文件

时间:2017-09-13 15:32:58

标签: arrays file powershell

好的,Powershell可能不是最好的工具,但它是唯一可用的工具。

我有一堆600K +行.csv数据文件。其中一些具有分隔符错误,例如"在文本字段的中间或""在一开始。它们太大了,无法编辑(即使在UltraEdit中)并且手动修复,即使我想要的也不是!

因为在一些文本字段的开头是双重"" -delimeter,而在某些文本字段的中间是" -delimiter,我还没有使用标题用于定义列的行,因为这些行看起来好像由于额外的分隔符而在其中有一个额外的列。

我需要解析文件,寻找""而不是"在文本字段的开头,也是为了寻找"在文本字段的中间并删除它们。

我已经设法编写代码来执行此操作(一种方式之后),基本上将整个文件读入一个数组,循环遍历它并将输出字符添加到输出数组。

我无法成功将此输出数组成功写入文件。

我已阅读了似乎相关的https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/out-file?view=powershell-5.1的每个部分。我还在这个网站上搜索了大约10个类似的问题,并尝试从他们那里搜集各种代码。

输出数组使用Write-Host完美地打印到屏幕,但我无法将数据恢复到文件中以获得爱情或金钱。到目前为止,我总共有1.5天的Powershell体验!感谢所有建议。

这是我的代码,用于读取/识别恶意分隔符(不是很漂亮(根本不是),请参考先前对数据的解释和可用的技术限制):

$ContentToCheck=get-content 'myfile.csv' | foreach { $_.ToCharArray()}
$ContentOutputArray=@()

for ($i = 0; $i -lt $ContentToCheck.count; $i++)
{
    if (!($ContentToCheck[$i] -match '"')) {#not a quote

    if (!($ContentToCheck[$i] -match ',')) {#not a comma i.e. other char that could be enclosed in ""


        if ($ContentToCheck[$i-1] -match '"' ) {#check not rogue " delimiter in previous char allow for start of file exception i>1?


            if (!($ContentToCheck[$i-2] -match ',') -and !($ContentToCheck[$i-3] -match '"')){
                Write-Host 'Delimiter error' $i 
                $ContentOutputArray+= ''

            }#endif not preceded by ",


        }#endif"

        else{#previous char not a " so move on

            $ContentOutputArray+= $ContentToCheck[$i]

        }

    }#endifnotacomma

    else
    {#a comma, include it

        $ContentOutputArray+= $ContentToCheck[$i]       
    }#endacomma

}#endifnotaquote

else
{#a quote so just append it to the output array

    $ContentOutputArray+= $ContentToCheck[$i]

}#endaquote

}#endfor 

到目前为止如此优秀,如果不优雅。如果我做一个简单的

Write-Host $ContentOutputArray 

数据很好地显示" 6 5" ," 652 | | 999" ," 99" ," " ," 678 | | 1" .....此外,当我检查阵列的大小时(基于其中一个问题文件的缩减版本)

   $ContentOutputArray.count

我得到2507个字符长度的数组。快乐。然而,然后各种使用:

   $ContentOutputArray | Set-Content 'myfile_FIXED.csv' 

创建空白文件

   $ContentOutputArray | out-file 'myfile_FIXED.csv' -encoding ASCII 

创建空白文件

   $ContentOutputArray | export-csv 'myfile_FIXED.csv' 

只提供' #TYPE System.Char'在文件中

   $ContentOutputArray | Export-Csv 'myfile_FIXED.csv' -NoType 

给出空文件

   $ContentOutputArray >> 'myfile_FIXED.csv' 

将空格分隔,

我还可以尝试将一个字符数组写入平面文件?这似乎是一个基本的问题,但它让我难过。谢谢你的阅读。

1 个答案:

答案 0 :(得分:4)

在导出之前将char数组转换(或转换)为字符串。

(New-Object string (,$ContentOutputArray)) |Set-Content myfile_FIXED.csv