将列或行添加到csv文件(matlab或cmd)

时间:2015-04-16 22:19:40

标签: matlab csv awk sed append

我认为这是一个非常常见的问题,但我找不到足够准确的答案。我需要使用MATLAB或使用足够简单的命令行提示来回答。 我在目录中有(很多).csv文件,它们都是相似的。说文件看起来像,

1,2
3,4

我现在希望它们看起来像

,c1,c2
t1,1,2
t2,3,4

我不是100%确定如何在StackExchange上正确格式化条目。第一行和第二行之间没有空行。我正在做的是 - 我添加了一个列" t1 t2 ..."和行" c1 c2 ..."到所有文件。文件中的第一个单元格是空白的。我需要对目录中的所有文件执行此操作。当然,t1 t2值和c1 c2值应该针对文件的整个大小运行。

我如何做到这一点?

4 个答案:

答案 0 :(得分:1)

这是另一个awk脚本:

#!/usr/bin/awk -f

BEGIN { FS=OFS="," }
{
    if( FNR==1 ) {
        close(fn); fn=FILENAME ".new"; printf OFS > fn

        for(i=1; i<=NF; i++) {
            printf "c%d%s", i, (i!=NF) ? OFS:"\n" > fn
        }
    }
    print "t"FNR OFS $0 > fn
}

执行以下操作:

  • BEGIN { FS=OFS="," } - sets the field separators to,`
  • FNR==1 - 在每个输入文件的第一行close(fn),如果它已打开,请设置fn等于&#34;您的filename.new&#34 ;然后打印一个前导,FNR是当前文件中的行号。
  • 同时根据第一个数据行中的字段数创建c#标题,并将其打印到fn

然后,将所有行视为有效数据行(无注释):

  • t# OFS添加到每个数据行,然后将其打印到fn

我将awk脚本放入文件script.awk然后chmod +x script.awk

在同一目录中给出以下两个输入数据文件(data1data2):

cat data1 data2
1,2 
3,4 
1,2,3
4,5,6
7,8,9

并运行像script.awk data*这样的脚本会提供以下两个.new数据文件:

cat data1.new data2.new
,c1,c2
t1,1,2 
t2,3,4 
,c1,c2,c3
t1,1,2,3
t2,4,5,6
t3,7,8,9

只要文件名彼此相似且不匹配脚本的名称,就应该很容易将它们全部传递给脚本。当数字的长度增加时,我没有任何对齐列的内容,只足以为c#行提供一个前导空格。

答案 1 :(得分:0)

你应该展示一些你已经厌倦的代码,如果它不起作用,你可以问堆栈溢出的人,大多数人在没有代码的情况下甚至不会帮助你。以下是您要做的事情的概要,您可以在自己喜欢的编程语言/环境中实现它

  1. 创建新的输出文件
  2. 打开现有的 csv 文件
  3. 将新行添加到输出文件的顶部(c1 c2 c3 ..)
  4. csv

    中的每一行

    现在我们正在尝试在输出文件中创建每一行

    一个。使用空格(或其他一些分隔符)分割线

    湾将t1写入输出并插入分隔符

    ℃。从你的分裂中写下第一个和第二个“代币”

    d。将t2写入输出并插入分隔符

    即将剩余列写入行

    F。在输出文件

  5. 中插入换行符
  6. 关闭 csv 输出文件

  7. 可选“覆盖”原始csv

    1. 删除原始 csv
    2. 输出文件重命名为旧的 csv 文件名

答案 2 :(得分:0)

awk '{
      FS=" "
      if (NR == 1) {
         printf ("%s", FS)
         for (col=1;col < NF;col++) printf( "c%d%s", col, FS)
         printf( "c%d\n", NF)
         }
     if ( $0 !~ /^[[:space:]]*$/ ) {
         printf ( "t%d%s%s\n", NR, FS, $0)
         }
     }' YourFile
  • 假设这里(对于csv来说很奇怪)空间是分隔符,对于任何传统的分隔符,只需使用分隔符值调整FS=" "
  • 在第一行添加标题列
  • 添加tX行首
  • 将第1行作为标题
  • 中列数的参考

添加find ...或批处理循环以在文件夹中的每个csv中更改

答案 3 :(得分:0)

使用GNU awk 4. *代表-i inplace

$ cat tst.awk
BEGIN { FS=OFS="," }
FNR==1 {
    for (i=1;i<=NF;i++)
        printf "%sc%d%s",(i>1?"":OFS),i,(i<NF?OFS:ORS)
}
{ print "t" FNR, $0 }

$ cat file
1,2
3,4

$ awk -i inplace -f tst.awk file

$ cat file
,c1,c2
t1,1,2
t2,3,4

只需将file更改为*,即可更新目录中的每个文件。