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

Adding a column or row to a csv file (matlab or cmd)

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

1,2
3,4

我现在希望它们看起来都像

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

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

我该如何完成?

你应该展示一些你厌倦的代码,如果它不起作用,你可以问stack overflow上的人,这里的大多数人甚至不会在没有代码的情况下帮助你。这是一个大纲,你可以在你喜欢的编程中实现它language/environment

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

    现在我们正在尝试在输出文件

    中创建每一行

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

    b。将 t1 写入 output 并插入定界符

    c。从你的拆分

    中写出第一个和第二个"tokens"

    d。将 t2 写入 output 并插入 delimter

    e。将剩余的列写入行

    f。在 output file

  5. 中插入换行符
  6. 同时关闭 csvoutput 文件

可选"overwriting"原始csv

  1. 删除原来的csv
  2. output 文件重命名为您的旧 csv 文件名
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 ( [=10=] !~ /^[[:space:]]*$/ ) {
         printf ( "t%d%s%s\n", NR, FS, [=10=])
         }
     }' YourFile
  • 这里假设(对于 csv 很奇怪)space 是分隔符,对于任何更传统的分隔符,只需将 FS=" " 调整为您的分隔符值
  • 在第一行添加您的 header 列
  • 添加 tX 行首
  • header
  • 中的列数以第一行为参考

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

这是另一个 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 [=10=] > fn
}

执行以下操作:

  • BEGIN { FS=OFS="," } - sets the field separators to,`
  • FNR==1 - 在每个输入文件的第一行,close(fn) 如果它是打开的,设置 fn 等于 "your filename.new",然后打印一个前导 ,FNR 是当前文件中的行号。
  • 同时根据第一个数据行中的字段数创建 c# headers,并将它们打印到 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# 行一个前导 space。

将 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, [=10=] }

$ cat file
1,2
3,4

$ awk -i inplace -f tst.awk file

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

只需将 file 更改为 *,它就会更新您目录中的每个文件。