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

Macos 查找CSV文件列中的最大字符数,macos,csv,command-line,Macos,Csv,Command Line,我是Mac新手,需要将csv文件导入mssql数据库。大型csv文件。我正在使用导入向导进行实际导入,但很难确定每列的最长字符串 我发现以下命令行将显示所选列中的值: cut -d, -f<column number> <path to csv file name> cut-d,-f 现在我想输出该列的最长长度。道具,任何人都可以帮助我返回所有列的长度 提前感谢您的问题的第一部分在标记为重复的帖子中得到了回答,但要应用于所有列,此bash单行脚本将为您提供所有列的最大

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

我发现以下命令行将显示所选列中的值:

cut -d, -f<column number> <path to csv file name>
cut-d,-f
现在我想输出该列的最长长度。道具,任何人都可以帮助我返回所有列的长度


提前感谢

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

您甚至可以将其放入一个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
#/bin/bash
对于((i=1;i<`head-1$1 | awk'{print NF}'FS=,`+1;i++));
do echo | xargs echo-n“第$i列:”
&&切割-d,-f$i$1 | wc-L;完成

将其另存为
something.sh
,然后执行
chmod+x something.sh
,并使用
/something.sh您的_csv_文件.csv
在标记为重复的帖子中回答您问题的第一部分,但要将其应用于所有列,此bash单行脚本将为您提供所有列的最大长度(基于文件的第一行):

您甚至可以将其放入一个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
!/bin/bash
对于((i=1;i<`head-1$1 | awk'{print NF}'FS=,`+1;i++));
do echo | xargs echo-n“第$i列:”
&&切割-d,-f$i$1 | wc-L;完成
将此保存为
something.sh
,然后执行
chmod+x something.sh
,并使用
/something.sh您的_csv_文件.csv

作为@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] ;
}
要对列进行排序,请执行以下操作:

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] ;
}
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] ;
}
要对列进行排序,请执行以下操作:

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] ;
}

感谢您的帮助,但当我通过mac终端运行此操作时,我收到表中每列的以下错误:wc:invalize option--L用法:wc[-clmw][file…]。我尝试使用错误消息中列出的所有参数再次运行代码,但在运行这些参数时会得到奇怪的规则。151822 151822 151822 151822,并且代码中的字符远没有那么多string@MichaelBW哦,我在Linux上试过了,似乎Mac版的wc不支持-L。让我看看。@MichaelBW我找不到一个现在就快速解决问题(我现在是半夜),但我明天会研究,因为我确信这是可以解决的。我感谢您的时间和努力。感谢@Archemar提供的答案,它应该会起作用,他应该因为提供了公认的答案而得到认可(我在SE Unix&Linux站点上问了这个问题)。感谢您的帮助,但当我通过mac终端运行此操作时,我收到表中每列的以下错误:wc:invalize option--L用法:wc[-clmw][file…]。我尝试使用错误消息中列出的所有参数再次运行代码,但在运行这些参数时会得到奇怪的规则。151822 151822 151822 151822,并且代码中的字符远没有那么多string@MichaelBW哦,我在Linux上试过了,似乎Mac版的wc不支持-L。让我看看。@MichaelBW我找不到一个现在就快速解决问题(我现在是半夜),但我明天会研究,因为我确信这是可以解决的。我感谢您的时间和努力。感谢@Archemar提供的答案,它应该会起作用,他应该因为提供了公认的答案而得到认可(我在SE Unix&Linux站点上问了这个问题)。这种简单化的方法对(引用的)单元格内容中包含换行符和分隔符(
)的真实CSV文件没有帮助。这种简单化的方法对(引用的)单元格内容中包含换行符和分隔符(
)的真实CSV文件没有帮助单元格内容。哦,这太棒了。我在乱搞
readline
,但这要快得多。哦,这太棒了。我在乱搞
readline
,但这要快得多。
mybox$ awk -F, -f test.awk a.txt
Columen1: 6
Columen2: 7
Columen3: 4
Columen4: 4
Columen5: 3