为了正确地将约10MB~80k行的CSV文件加载到MySQL,我需要在LOAD DATA INFILE
查询中提供正确的行终止符。不幸的是,源CSV文件有两种形式:换行符为LF
(Linux上的mysqldump)或CRLF
(我们的DBA团队制作那些)。
我一直在寻找一种方法来读取文件,直到我遇到换行符,然后通过检查回车是否先于它来确定使用哪一行结尾。
有很多基于Get-Content
的示例可以读取整个文件,或者我可以读取最后两个字节的文件。第一个太慢而且效率低,第二个不够可靠,因为某些文件由于某种原因在最后没有CRLF
。
考虑到上述情况,在我点击LF
之前阅读该文件似乎更合理,但我无法将Get-Content
转换为" stream"文件,我不知道第一行结束的距离。
非常感谢您的想法。
答案 0 :(得分:3)
Get-Content
无法执行您想要的操作,因为它将整个文件作为单个sring(-Raw
)读取,或者作为行数组读取,同时从行结束中删除CR和LF。
StreamReader
可以满足您的要求:
$file = 'C:\path\to\your.file'
$reader = [IO.File]::OpenText($file)
$prev = $null
$char = $null
while ($reader.Peek() -ge 0 -and $char -ne 10) {
$prev = $char
$char = $reader.Read()
}
$reader.Close()
$reader.Dispose()
if ($prev -eq 13) {
# file has CR-LF line breaks
}