为了正确地加载一些〜10MB〜80K线CSV文件,我需要在LOAD DATA INFILE
查询中提供适当的线路终止器。不幸的是,源CSV文件有两种口味:新线作为LF
(Linux上的mysqldump)或CRLF
(我们的DBA团队都可以制作这些)。
我一直在寻找一种读取文件的方法,直到遇到线供稿字符,然后通过检查托架返回之前弄清楚使用哪个线路结束。
有很多基于Get-Content
的示例可以读取整个文件,或者我可以读取最后两个字节的文件。第一个原因太慢且效率低,第二个不够可靠,因为某些文件的目的是某些原因没有CRLF
。
考虑到上面,读取文件直到我击中LF
似乎更合理,但是我不能让Get-Content
"流"该文件,而我不知道第一行结束是多远。
会感谢您的想法。
Get-Content
无法做您想做的事,因为它要么将整个文件读取为单个SRING(-Raw
),要么将CR和LF从行末端剥离Cr和LF时。
StreamReader
可以做您要的事情:
$file = 'C:pathtoyour.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
}