csv - 文件内容读取

逗号分隔值(Comma-Separated Values,有时也称为字符分隔值,因为分隔字符也可以不是逗号)。

csv 文件,就是通过逗号和换行符,将数据字段进行拼接,从而形成的文件。

比如:

姓名, 年龄
ming, 18
dong, 20

标准读写

很容易发现一个问题:如果字段本身包含逗号,或者换行符,需要进行转义,文件的读写就会变得极其困难。

标准的 csv 文件,应当有这些特点:

  • csv 文件不是按行读取,而是按字符读取;
  • csv 文件的一行,不等价于一行记录,如果字段中包含换行符,一行记录就会被拆分成多行;
  • csv 文件每一行,字段总数并不是固定的;
  • csv 文件的字段,允许包含逗号和引号,需要进行转义,这时候字段需要用引号圈起来;

csv 文件的读取,实际上,不能草率地直接按行读取:

  • 读取一个字段,如果首字符是引号,则说明字段值中,可能包含引号;
  • 引号的转义,是两个引号,读取到两个引号,需要转义成一个引号;
  • 读取到“引号+逗号”,则说明当前字段读取结束;
  • 读取到“引号+换行符”,则说明当前记录读取结束;

其中,读取到单引号,但是没有跟逗号或者引号,则说明文档内容有误,但是无需报错,当成单引号正常读取即可。

不推荐自己编写专业读取工具

想要设计专业的工具,使用标准的手段进行读取,不要尝试自己编码,因为短期内根本不可能实现。

推荐选用类库:open-csv,csv-reader 等。

问题分析:

如果只考虑到功能实现,按照前面提到的思路,一个字符一个字符地读取,技术上没啥问题,最终自然是能实现;

但是,编码实现过程中,必定用到 StringBuilder,如果一个字符一个字符地追加,会造成严重的性能浪费;


关键代码如下,如果你已经准备编码,就会发现算法难度极高。

想要优化得好,最终的代码,只会比 BufferedReader 复杂,除非你有很多时间,不然不推荐自己写。

class Test{

    // 最终会用到的应当是一个字符流
    public static Reader reader;
	
	// 考虑到性能,必定会用到缓存,一次读取一大段
    public static char[] buf;

    public static void main(String[] args) throws IOException {
        len = reader.read(buf);
		
		// 这个函数必定被用到	
        new StringBuilder().append(buf, 0, len);
    }
}

posted on   疯狂的妞妞  阅读(51)  评论(0编辑  收藏  举报

(评论功能已被禁用)
相关博文:
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· 万字调研——AI生成内容检测
· 解决跨域问题的这6种方案,真香!
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示