我有一堆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'
将空格分隔,
我还可以尝试将一个字符数组写入平面文件?这似乎是一个基本的问题,但它让我难过。谢谢你的阅读。
答案 0 :(得分:4)
在导出之前将char数组转换(或转换)为字符串。
(New-Object string (,$ContentOutputArray)) |Set-Content myfile_FIXED.csv