Linux 如何在没有不必要的空间的情况下创建CSV文件
我使用xls2csv二进制文件在我的linux red hat机器中将XLS文档转换为CSV 示例:从手册页Linux 如何在没有不必要的空间的情况下创建CSV文件,linux,bash,perl,awk,sed,Linux,Bash,Perl,Awk,Sed,我使用xls2csv二进制文件在我的linux red hat机器中将XLS文档转换为CSV 示例:从手册页 xls2csv -x "1252spreadsheet.xls" -b WINDOWS-1252 -c "ut8csvfile.csv" -a UTF-8 但是我注意到了下面的问题-步骤1、2下面的问题在我的bash脚本中引起了很多麻烦 问题是: 1 CSV文件在word的左侧或右侧包含不必要的空格 CSV中错误语法的示例 ,"/var/adm/sys ldd/all /Comm
xls2csv -x "1252spreadsheet.xls" -b WINDOWS-1252 -c "ut8csvfile.csv" -a UTF-8
但是我注意到了下面的问题-步骤1、2下面的问题在我的bash脚本中引起了很多麻烦
问题是:
1 CSV文件在word的左侧或右侧包含不必要的空格
CSV中错误语法的示例
,"/var/adm/sys ldd/all /Comm/logs ","WORD "," WORD"
," WORD ",
csv中正确语法的示例
,"/var/adm/sys ldd/all /Comm/logs",WORD,WORD
,WORD,
即使单词在分隔符之间只有一个单词,CSV中也会出现2个引号。事实上,如果分隔符之间只有一个单词,我们不需要引号分隔符“,”
CSV中错误语法的示例
,"/var/adm/sys ldd/all /Comm/logs ","WORD "," WORD"
," WORD ",
csv中正确语法的示例
,"/var/adm/sys ldd/all /Comm/logs",WORD,WORD
,WORD,
请建议如何解决此处描述的问题,以便根据步骤1,2创建干净的csv文件
可以使用awk、sed、perl一行程序或bash脚本下的任何解决方案来实现
修复之前的CSV文件示例
1,"/var/adm/sys ldd/all /Comm/logs",34356,"234245 ",24245
2,"/var/adm/sys ldd/all
/Comm/debugs.txt"," 45356",435," 578 58976 "
3," add this line in crontab :",34356,"234245 ",24245
4,"1.0348 54 35.5"," 45356"," 435","578 "
4,"1 2 "," 45356 95857 "," 435","578 "
5,"1 2 "," 45356 95857 "," "435","578" "
6,"1.0348 54 35.5"," 45356"," "4""" ""35","578 "
7,"1.0348 54 35.5",""45356",""4"""""35,"578 "
修复后正确的CSV文件示例
1,"/var/adm/sys ldd/all /Comm/logs",34356,234245,24245
2,"/var/adm/sys ldd/all
/Comm/debugs.txt",45356,435,"578 58976"
3,"add this line in crontab :",34356,234245,24245
4,"1.0348 54 35.5",45356,435,578
4,"1 2","45356 95857",435,578
5,"1 2","45356 95857","435,578"
6,"1.0348 54 35.5",45356,"4""" ""35,578
7,"1.0348 54 35.5",""45356",""4"""""35,578
逗号不能出现在字段中
请注意第2行字段中包含的显式换行符
如果字段在双引号内且不包含空格,例如第7 45356行,则不得删除这些双引号,因为包含这些引号的整个字段都是编码密码
awk -F, -v OFS=, '{ for (i = 1; i <= NF; ++i) { gsub(/(^"?[[:space:]]*|[[:space:]]*"?$)/, "", $i); if ($i ~ /[[:space:]]/) $i = "\"" $i "\"" } } 1' file
唯一的问题是,值上不能有逗号,例如,这是一个值。试试这个perl单行程序:
perl -i -nle 'chomp($_);$_=~s/\s*"\s*/"/sg;print "$_"' file
我发现了一个错误-例如,如果最后一行是->4,1,2,45356 95857,435578,则无需在435之前删除报价,只需删除左侧或右侧的报价,因为有时报价是word@maihabunash我的脚本不会产生你期望的输出吗?@Maihabunah什么?这就产生了您在问题中的确切示例输出?在分配测试后,我发现您的代码不支持CSV文件第7行中的示例,您的代码打印为:7,1.0348 54 35.545356435578,如您所知,如果分隔符之间没有空格,则无需删除引号-示例-435无需删除引号,基本概念是这样的-如果WORD左侧或右侧有空格,则需要删除引号,并且只有当WORD是单个单词时,单词45356的右侧或左侧没有空格,因此无需删除引号,因为单词可以是密码,passwrd可以是例如H^3GB或例如&GF%R$,如果您能帮助我更新我的问题,我将不胜感激,我想因为您的经验,您的更新将比我的更新更清晰