我有一个应用程序,它处理通过RabbitMQ从许多不同的上游应用程序提供的CSV - 通常每个文件5000-15,000行。大部分时间它都很棒。然而,其中一些上游应用程序已经过时(12 - 15年),编写它们的人早已不复存在。
由于换行,我无法从这些较旧的应用程序中读取CSV文件。我觉得这有点奇怪,因为换行看到映射到UTF-8回车(http://www.fileformat.info/info/unicode/char/000d/index.htm)。通常,应用程序只读取那些旧文件中的标题,而不是其他内容。
如果我在文本编辑器中打开其中一个文件并保存为utf-8编码覆盖现有文件,那么它根本没有问题。
我试过的事情我希望能够发挥作用:
- 使用读者:
ba := make([]byte, 262144000)
if _, err := file.Read(ba); err != nil {
return nil, err
}
ba = bytes.Trim(ba, "\x00")
bb := bytes.NewBuffer(ba)
reader := csv.NewReader(bb)
records, err := reader.ReadAll()
if err != nil {
return nil, err
}
- 使用扫描仪逐行读取(获取bufio.Scanner:令牌太长)
scanner := bufio.NewScanner(file)
var bb bytes.Buffer
for scanner.Scan() {
bb.WriteString(fmt.Sprintf("%s\n", scanner.Text()))
}
// check for errors
if err = scanner.Err(); err != nil {
return nil, err
}
reader := csv.NewReader(&bb)
records, err := reader.ReadAll()
if err != nil {
return nil, err
}
我试过的事情我希望不会工作(并没有):
我知道https://godoc.org/golang.org/x/text/transform包但不太确定可行方法 - 看起来需要知道src编码才能进行转换。
我愚蠢地忽略了什么吗?是否有任何建议如何将这些文件转换为UTF-8或更新行结尾而不知道文件编码,同时保持应用程序适用于所有其他有效的CSV文件?是否有任何选项不涉及我进行字节到字节和做一个字节。我没有考虑? 我希望我忽略了一些非常明显的事情。
道歉 - 由于显而易见的原因,我无法共享CSV文件。
答案 0 :(得分:1)
您是否尝试将\ r \ n或\ r \ n中的所有行结尾替换为\ n?