【问题标题】:Making csv from txt files从txt文件制作csv
【发布时间】:2010-11-30 11:32:34
【问题描述】:

我有很多这样的txt文件:

Title 1
Text 1(more then 1 line)

我想从所有这些文件中制作一个 csv 文件,它看起来像这样:

Title 1,Text 1
Title 2,Text 2
Title 3,Text 3
etc

我该怎么做?我认为 awk 对它有好处,但不知道如何实现它。

【问题讨论】:

  • 如果您以可读的方式格式化您的代码并显示一些示例输入数据以及您希望输出数据的样子,将会有所帮助。你说“bash”,但唯一的“bash”是for 循环和重定向。其中大部分是 AWK。

标签: csv awk


【解决方案1】:

我可以建议:

paste -d, file1 file2 file3

要处理大量文件,每个输出文件最多 40 个(未经测试,但已关闭):

xargs -n40 files... echo >tempfile
num=1
for line in $(<tempfile)
do
    paste -d, $line >outfile.$num
    let num=num+1
done

【讨论】:

    【解决方案2】:

    这与您发布的内容大致相同。

    for text in *
    do
        awk 'BEGIN {q="\""; print q}
             NR==1 {
                    gsub(" "," ")    # why?
                    gsub("Title: *","")
                    print
                   }
             NR>1  {
                    gsub(" "," ")    # why?
                    gsub("Content: *","")
                    gsub(q,q q)
                    print
                   }
    
             END {print q}' "$text" >> ../final
    done
    

    编辑:

    如果你有一堆只包含两行的文件,试试这个:

    sed 'N;s/\n/,/' file*.txt
    

    如果每个文件包含多于两行,那么它将把每对行放在同一行上,用逗号分隔。

    【讨论】:

    • 是的,但它不起作用。结果我得到一列,而不是两列。
    • @llokely: 把第一个print 改成printf $0 效果会更好吗?如果您在问题中包含一些示例,那将真的很有帮助。
    • @llokely:好吧,如果你不提供更多信息,那我真的无能为力了。我无法读懂你的想法,在这一点上,我所做的只是猜测。
    • 我在一个目录中有文件,我需要从它们制作一个 csv 文件,我需要第一行进入第一列,其他内容进入第二列。我有这样的脚本来制作它,但我把它弄丢了,我提供的脚本是它的 alpha 版本,它不起作用,但我认为它可以帮助制作一个好的脚本。
    • 我的文件包含超过 2 行,用逗号分隔其他行将不好。
    【解决方案3】:

    给定 3 个包含以下数据的文件:

    file1.txt

    Heading 1
    Text 1
    Text 2
    

    file2.txt

    Heading 2
    Text 1
    

    file3.txt

    Heading 3
    Text 1
    text 2
    Text 3
    

    预期结果是:

    Heading 1,Text 1,Text 2 
    Heading 2,Text1 
    Heading 3,Text 1,text 2,Text 3
    

    这是使用下面调用的程序 createcsv.awk 完成的

    gawk -f createcsv.awk file1.txt file2.txt file3.txt
    

    createcsv.awk

    {
      if (1 == FNR) {
         # It is the first line of a new file
         if (csvline != "") {
           # First file or empty files we can ignore
           print csvline;
         }
         csvline = "";
         delimiter = "";
      }
      csvline = csvline delimiter $0;
      if ("" == delimiter) { delimiter="," }
    }
    END{
     print csvline;
    }
    

    【讨论】:

    • 或调用为 gawk -f createcsv.awk 文件*.txt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多