涉及CSV文件的io.Reader和换行符问题

时间:2017-07-06 11:20:16

标签: go

我有一个应用程序,它处理通过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
}

我试过的事情我希望不会工作(并没有):

  • 将文件内容写入新文件(.txt)并重新读取文件(包括针对创建的txt文件运行dos2unix)
  • 将文件读入标准字符串(希望Go的UTF-8编码会神奇地启动,当然不会这样)
  • 将文件读取到符文切片,然后通过字节切片转换为字符串

我知道https://godoc.org/golang.org/x/text/transform包但不太确定可行方法 - 看起来需要知道src编码才能进行转换。

我愚蠢地忽略了什么吗?是否有任何建议如何将这些文件转换为UTF-8或更新行结尾而不知道文件编码,同时保持应用程序适用于所有其他有效的CSV文件?是否有任何选项不涉及我进行字节到字节和做一个字节。我没有考虑? 我希望我忽略了一些非常明显的事情。

道歉 - 由于显而易见的原因,我无法共享CSV文件。

1 个答案:

答案 0 :(得分:1)

您是否尝试将\ r \ n或\ r \ n中的所有行结尾替换为\ n?