我是Mac新手,需要将csv文件导入mssql数据库。大型csv文件。我正在使用导入向导进行实际导入,但我很难确定每列的最长字符串。
我找到了以下命令行,它将显示所选列中的值:
cut -d, -f<column number> <path to csv file name>
现在我想输出该列的最长长度。任何可以帮助我返回所有列的长度的人的道具。
提前致谢
答案 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
执行1>