数据包含逗号时在bash中生成CSV文件

时间:2017-08-02 13:27:49

标签: bash

我在使用bash编写的脚本时遇到问题。我在while循环中逐行读取.txt文件。该行的形式为x:y:z:a:b:c。每个元素('x','a'等)对应于诸如年龄,身高,姓名等内容。我已成功设法打印出所需的字段,但是当我尝试打印整个“x:y:z:a:b:c”时,“x:y:z”将打印到一个单元格中的.csv,并且“a:b:c”将转到下一个单元格,因为姓氏和名字中有一个逗号。我知道这听起来很混乱,所以如果有必要我可以进一步澄清,但这就是它的样子:

Cell 1                          Cell 2
age:height:number:last name     first name:language

我想在一个单元格中获取所有这些信息。我认为问题是由于姓氏和名字之间有逗号这一事实。如果您有任何提示或指示,请告诉我。

编辑:这是代码的样子:

while read INPUT do
    str=$INPUT
    IFS=: read -r -a ARR <<< "$str"
    NAME=${ARR[0]}
    AGE=${ARR[3]}
    echo $AGE, $NAME >>Filedirectory.filename.csv
done<filedirectory.filename.txt

...其中filedirectory.filename.txt包含以下内容:

INPUT=Smith, John:126 lbs:67in:26:College University

输入str = "Smith, John:126 lbs:67in:26:College University"的示例输入 所以,`NAME = Smith,John,AGE = 26.理想情况下,输出应该是彼此相邻的2个单元格,填充为:

26 - Smith, John

而不是我打开CSV文件时excel中的输出最终是:

12 - Smith - John

其中每个' - '表示一列(12在一个单元格中,姓氏在下一个单元格中等等。)我想要的是姓氏和名字在一个单元格中,但显然这个由于名称被格式化为“史密斯,约翰”并且逗号搞乱了这一事实,因此没有发生

3 个答案:

答案 0 :(得分:1)

一个简单的实现可能如下所示:

while IFS=: read -r name _ age _; do
    printf '"%s","%s"\n' "${name//\"/\"\"}" "${age//\"/\"\"}"
done <in.txt >out.csv

Less correctly(请参阅描述警告的链接规范的APPLICATION USAGE和RATIONALE部分),您可以使用echo执行此操作:

while IFS=: read -r name _ age _; do
    echo '"'"${name//\"/\"\"}"'","'"${age//\"/\"\"}"'"'
done <in.txt >out.csv

在这两种情况下,我们都使用引号包围单元格内容,并使用parameter expansion来加倍在字符串中找到的任何引号,这使得这些引号以CSV语法显示。

答案 1 :(得分:0)

您可以使用Excel功能:
当第一行为SEP=:时,将使用此作为SEP读取csv文件 现在很简单:

sed -r ' s/([^:]*):([^:]*):([^:]*):([^:]*):.*/\4:\1/;
        1s/.*/SEP=:\n&/'    < filedirectory.filename.txt > outputfile;

答案 2 :(得分:0)

我发现要这样做的一种方法是使用CSV感知工具,例如csvkit,它提供命令csvformat

while IFS=: read -r name _ age _; do 
    echo -e "${name}\t${age}"; 
done < filedirectory.filename.txt | csvformat -t > outputfile.csv