查找CSV文件列中的最大字符数

时间:2014-09-03 21:20:07

标签: macos csv command-line

我是Mac新手,需要将csv文件导入mssql数据库。大型csv文件。我正在使用导入向导进行实际导入,但我很难确定每列的最长字符串。

我找到了以下命令行,它将显示所选列中的值:

cut -d, -f<column number> <path to csv file name>

现在我想输出该列的最长长度。任何可以帮助我返回所有列的长度的人的道具。

提前致谢

2 个答案:

答案 0 :(得分:2)

as @jpw sugested

我的回答:

为什么不使用awk?

我没有要测试的mac,但是length()在awk中是一个非常标准的功能,所以这应该可行。

awk文件:

 { for (i=1;i<=NF;i++) {
    l=length($i) ;
    if ( l > linesize[i] ) linesize[i]=l ;
  }
}
END {
    for (l in linesize) printf "Columen%d: %d\n",l,linesize[l] ;
}

然后运行

mybox$ awk -F, -f test.awk  a.txt
Columen4: 4
Columen5: 3
Columen1: 6
Columen2: 7
Columen3: 4

要对列进行排序:

BEGIN{ maxi=-1 ; }
 { for (i=1;i<=NF;i++) {
    l=length($i) ;
    if ( l > linesize[i] ) linesize[i]=l ;
        if ( i > maxi ) maxi = i ;
   }
  }
END {
    for (i=1;i<=maxi;i++) printf "Columen%d: %d\n",i,linesize[i] ;
}

给出:

mybox$ awk -F, -f test.awk a.txt
Columen1: 6
Columen2: 7
Columen3: 4
Columen4: 4
Columen5: 3

答案 1 :(得分:1)

您的问题的第一部分在标记为重复的帖子中得到解答,但要将此应用于所有列,此bash单行脚本将为您提供所有列的最大长度(基于文件的第一行) :

for((i=1;i< `head -1 test.csv|awk '{print NF}' FS=,`+1 ;i++)); do echo  | xargs echo -n "Column$i: " && cut -d, -f $i test.csv |wc -L  ; done

为了解释它是如何工作的,for循环从1开始并使用awk来确定列数,然后使用管道(|)到cut -d, -f <column number>执行wc -L到返回最大长度。

我的示例文件的输出有五列:

Column1: 6
Column2: 7
Column3: 4
Column4: 4
Column5: 3

您甚至可以将它放在一个shell脚本中,该脚本将csv文件的文件名作为参数:

#!/bin/bash

for((i=1;i< `head -1 $1|awk '{print NF}' FS=,`+1 ;i++));
do echo  | xargs echo -n "Column$i: "
&& cut -d, -f $i $1 |wc -L  ; done

将其保存为something.sh,然后执行chmod + x something.sh并使用./something.sh your_csv_file.csv执行