【问题标题】:Is using temporary placeholders for CSV special characters a bad practice?对 CSV 特殊字符使用临时占位符是一种不好的做法吗?
【发布时间】:2019-11-26 12:06:02
【问题描述】:

我正在处理许多不同格式的 CSV 文件,通常由普通用户手工编写,因此字段内有很多 ; , \n\t 等, 这种字符通常在解析数据或生成新的 CSV 文件时会引起麻烦,我通常会事先删除这些字符,但今天我在一个旧程序中发现了以下代码:

它从resultSet读取数据并将每个值连接成String形成一行,并处理分隔符(我们通常使用;),这段代码首先使用了一个临时标志,如#TempSeparator#划分每个字段,然后,当行完成时,应用replaceAll(";","") 删除假分隔符,然后,replaceAll("#TempSeparator#", ";") 形成有效行

我实际上认为这是一种避免对每个字段进行不必要调用的聪明方法,并且只对整行进行替换,但我认为这不是最好的,甚至不是最佳的方法。

这真的是个坏习惯吗?

【问题讨论】:

    标签: java string csv


    【解决方案1】:

    这不是非常糟糕,但也不是最好的方法。

    尽可能使用标准库。 Here is a list 的优秀库,其中 SuperCSV 在支持 CSV 变体方面特别强大。这些库遵循最佳实践:在字段中使用特殊字符时会转义,或者字段被换行(通常带有引号)。

    如果 CSV 格式已经不正确,以至于特殊字符出现在字段中而没有适当的转义或换行,那么您手上就有数据清理问题,需要通过其他方式解决。用临时占位符替换字符并不能解决此问题,因为占位符同样会出现在字段内部和字段之间。

    【讨论】:

      【解决方案2】:

      这种方法对我来说听起来不是很优雅。你描述:

      1. 每个输入字段,使用#TempSeparator# 将其连接到单个字符串中
      2. 从结果字符串中消除所有;
      3. 将所有出现的#TempSeparator# 替换为;

      这是 3 个步骤。怎么样:

      1. 每个输入字段,去掉所有;
      2. 然后,使用; 将其连接到一个字符串中

      少了一步。因此,更好。

      一些示例代码来展示为什么这更简单:

      流式:

      collection.stream().collect(Collectors.joining("#TempSeparator#"))
          .replace(";", "").replace("#TempSeparator#", ";");
      

      对比

      collection.stream().map(x -> x.replace(";", ""))
          .collect(Collectors.joining(";"));
      

      【讨论】:

        【解决方案3】:

        它是过度设计的,一个不必要的人工制品。

        至少使用一个常量字符:

        private static final char TEMP_SEPARATOR = '\u001f';
        
        • 标签通常不会出现在文本\t 中,它是理想的分隔符。
        • 否则一个控制字符会做:单位分隔符\u001f。可能是 Unicode 的。
        • 一个几乎无法使用的字符是\u0000

        优点是效率:

        s = s.replace(';', ',').replace('\u0000', ';');
        

        最好的解决方案仍然是替换单元格值本身的分隔符。 对于换行符可能必须这样做。

        关于最后的分隔符:恕我直言,制表符是比分号更好的选择,因为用空格替换制表符确实只会改变文本 w.r.t。空白。即:不会出现任何要求。喜欢的房间号必须是楼“;”号码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-29
          • 2021-01-10
          • 2013-09-04
          • 1970-01-01
          • 2018-10-03
          • 1970-01-01
          • 2014-09-09
          • 2016-06-06
          相关资源
          最近更新 更多