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);
}
}
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Blazor Hybrid适配到HarmonyOS系统
· 万字调研——AI生成内容检测
· 解决跨域问题的这6种方案,真香!
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库