Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在没有不必要的空间的情况下创建CSV文件_Linux_Bash_Perl_Awk_Sed - Fatal编程技术网

Linux 如何在没有不必要的空间的情况下创建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二进制文件在我的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/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$,如果您能帮助我更新我的问题,我将不胜感激,我想因为您的经验,您的更新将比我的更新更清晰