使用的工具是:MicrosoftOffice Excel 2013、Notepad++ v7.5.8
Spark数据处理任务生成了CSV格式的数据文件,然后要手动将CSV数据转换成excel文件,为了能识别分隔符自动分列以及中文不乱码:新建一个excel文件,然后在上方功能区选择“数据”-->“自文本”导入数据进excel文件,剩下的操作参考,然后提示报错“此文本文件包含的数据无法放置在一个工作表中。如要继续导入可容纳的数据,请单击确定。。。”,点击确定后只导入了第一行。
上网搜索了一下原因,说是文本文件行数超过了excel文件行数,于是我就去看了excel文件的最大行数,通过快捷键“ctrl + ⬇”到达excel文件的底部,发现excel文件最大行数是1048576,不过我的文件最大也是40多万条数据,按理说应该不会超过才对,那就可能是excel软件识别有问题。
但是我突发奇想,决定试试将CSV文件另存为另一个行数较少(65536)的CSV文件,然后再导入excel文件。于是用Notepadd++打开CSV文件,再另存修改文件拓展名。然后再导入excel文件发现居然成功了,按照这个操作40多万的数据也可以导入。解决方法就是:使用Notepadd++文本编辑器打开原始文件再复制里面内容另存为新文件,用新文件就可以导入数据文本了。(一定要复制内容另存新文件,不能直接打开再另存为新文件,不然还是不行),但是Notepadd++处理大文件会比较吃力,耗费时间长,性能没有UltraEdit强,如果是大文件推荐使用UltraEdit批量替换换行符,具体为什么要批量替换换行符及操作见下面说明。
具体原因的话我估计是因为excel文件识别换行符必须是 “\r”(回车CR)+ “\n”(换行LF),Spark数据处理任务生成的CSV文件只有“\n”(换行LF),因此对于excel文件来说就是不换行,然后列数超过限制了提示报错,而不是上面提到的行数超过限制提示报错。至于为什么会有这种差别是因为不同操作系统定义的换行不一样,Linux系统的换行是 “\n”(换行LF),我的Spark数据处理任务生成的CSV文件就是在Linux服务器生成的,而Windows系统的换行是“\r”(回车CR)+ “\n”(换行LF),因此Windows系列的软件Excel识别的换行跟Windows系统是一样的。这两个符号的区别是通过Notepadd++编辑器打开后显示全部符号才看出来的,一般比较难发现,如下所示,Notepad++在复制内容另存新文件后会自动补充为回车换行符。然后试了一下UltraEdit编辑器,发现不行,因为UltraEdit不会自动补充。然后又试了一下替换换行符为回车换行符,发现Notepad++可以替换,然后导入excel,UltraEdit编辑器也可以替换(推荐使用,性能好,数据量多时替换快),不过匹配模式要选择正则表达式,将\n替换为\r\n即可,详细配置见下图。
导出的原始CSV文件
使用Notepad++另存后的CSV文件
Notepad++批量替换
UltrEdit批量替换,正则表达式还要选择Unix类型