1

我得到了一个CSV文件,里面有很多无用的信息,我想把我需要的信息从这个文件放到另一个CSF文件中。

当前状态:

名字、中间名、姓氏、头衔、后缀、昵称、Given Yomi、Surname Yomi。。。。安吉尔、罗梅罗、、罗米、。。。。

在新文件中应该是这样的:

名字、姓氏、昵称安吉尔、罗梅罗、罗米

我想通过使用诸如cut和Column name之类的东西来实现这一点,而不仅仅是Field编号。不知怎么的,就像这样:

cut-d','-f“名字”文件

我知道这不管用,但还有别的办法吗?

8
  • 1
    由于您不需要重新排序,切割-d','-f'1,3,6'足够了 评论 2021年12月6日13:26
  • 你问了完全相同的问题。请编辑原始问题,而不是打开新问题 评论 2021年12月6日13:43
  • “我想通过使用诸如cut和Column名称之类的东西来实现这一点,而不仅仅是Field编号。”为什么?如果这真的是你想要的,那么试试SQL。应该很容易导入到任何小型数据库中。 评论 2021年12月6日14:12
  • 这个csv输出命令来自csvkit软件确实如此:csvcut-Sc“名字”,“姓氏”file.csv 评论 2021年12月6日15:14
  • @glennjackman我试过了,但它总是告诉我“csvcut:找不到命令”,即使我安装了csvkit 评论 2021年12月6日15:31

5个答案5

重置为默认值
2

工具是米勒:

mlr—csv cut-o-f“字段A”,“字段B”input.csv>output.csv

在这里文档动词。

2
  • 1
    由于某些原因,我无法安装该工具。。 评论 2021年12月7日12:25
  • @马哈茂德·阿卜杜勒卡里姆你的操作系统是什么?安装过程中出现了哪些错误?
    – 土著人
    评论 2021年12月7日14:30
1
awk-v tags='名字,姓氏,昵称''开始{FS=“,*”;OFS=“,”numOutFlds=拆分(标记,outFldNr2tag)}NR==1{对于(inFldNr=1;inFldN r<=NF;inFldNr++){tag=$inFldNrtag2inFldNr[标签]=inFldN}}{用于(outFldNr=1;outFldNr<=numOutFlds;outFldNr++){tag=outFldNr2tag[outFldNr]inFldNr=标签2inFldN r[标签]val=$inFldNr打印f“%s%s”,val,(outFldNr<numOutFld?OFS:ORS)}}'文件名字、姓氏、昵称安吉尔、罗梅罗、罗米
1
$猫csvcut.awk#csvcut.awk公司函数csvsplit(str、arr、i、j、n、s、fs、qt){#将逗号分隔的字段拆分为arr;返回arr中的字段数#双引号括起来的字段可以包含逗号;#双引号表示单个嵌入引号删除arr;s=“启动”;n=0;fs=“,”;qt=“\”对于(i=1;i<=长度(str));i++){如果(s==“启动”){if(substr(str,i,1)==fs){arr[++n]=“”}else if(substr(str,i,1)==qt){j=i+1;s=“INQUOTES”}否则{j=i;s=“INFIELD”}}否则,如果(s==“INFIELD”){if(substr(str,i,1)==fs){arr[++n]=子(str,j,i-j);j=0;s=“开始”}}else if(s==“INQUOTES”){if(substr(str,i,1)==qt){s=“MAYBEDOUBLE”}}否则,如果(s==“可能加倍”){if(substr(str,i,1)==fs){arr[++n]=子(str,j,i-j-1)gsub(qt-qt,qt,arr[n]);j=0;s=“开始”}}如果(s==“INFIELD”||s==”INQUOTES“){arr[++n]=substr(str,j)}否则,如果(s==“可能加倍”){arr[++n]=子(str,j,长度(str)-j);gsub(qt-qt,qt,arr[n])}else如果(s==“START”){arr[++n]=“”}返回n}开始{#读取和存储输出字段名对于(i=1;i<ARGC;i++){字段[++nfields]=ARGV[i];ARGV[i]=“”}}NR==1{#读取并存储输入字段名,写入输出头对于(i=1;i<=csvsplit($0,arr));i++){名称[arr[i]]=i}对于(i=1;i<=nfields;i++){printf“%s%s”,sep,字段[i];sep=“,”}打印“\n”}NR>1{#读取输入记录,分割字段,写入输出记录删除csv;sep=“”;n=csvsplit($0,csv)对于(i=1;i<=域;i++){打印f“%s%s”,sep,csv[名称[字段[i]]];sep=“,”}打印“\n”}$cat mahmoud.input名字、中间名、姓氏、头衔、后缀、昵称、GivenYomi、姓氏Yomi安吉尔、罗梅罗、、、罗米、,,$awk-f csvcut.awk名字姓氏昵称<mahmoud.input名字、姓氏、昵称安吉尔、罗梅罗、罗米
1

假设您有一个没有变量空间的直接CSV,您可以直接使用Ruby的CSV解析器(无需先清理CSV文件……)

鉴于:

cat文件名字、中间名、姓氏、头衔、后缀、昵称、名字Yomi、姓氏Yomi安吉尔、罗梅罗、、、罗米、,,

您可以只过滤每个csv行:

ruby-r CSV-e'BEGIN{wanted=[“名字”,“姓氏”,“昵称”]把想要的东西放到csv}     CSV.parse($<.read,headers:true).each{|h |放入h.to_hash.select{|k、 想要包含吗?(k) }.values.to_csv}'文件

打印:

名字、姓氏、昵称安吉尔、罗梅罗、罗米

这里的优点是支持完整的csv文件,包括带内嵌分隔符的引号字段。

1

可能较晚,也不太通用,但如果不需要重用脚本,则非常简单:

awk'BEGIN{FS=“,*”;OFS=“,”}{print$1,$3,$6}'输入.csv>output.csv

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.