对 CSV 文件中的列进行排序

对 CSV 文件中的列进行排序

我正在尝试按 CSV 文件中的列名称对所有列进行排序。我所拥有的是这样的:

name  ,adress  ,mobile-number
Ane   ,USA     ,12121212
Joane ,England ,234234

我需要的输出是

adress ,name  ,mobile-number
USA    ,Ane   ,12121212
England,Joane ,234234

问题是我有超过三列,而且我不知道它们的排列顺序,但我需要按升序对它们重新排序。

答案1

使用 Miller( mlr) 清理每个字段中(包括标题中)过多的空白,然后对字段重新排序:

$ mlr --csv clean-whitespace then reorder -f adress,name,mobile-number file
adress,name,mobile-number
USA,Ane,12121212
England,Joane,234234

(请注意,使用reorder -f adress只会将adress字段移动到字段的开头,在这种情况下将具有相同的效果。)

或者,如果您想根据标题的排序方式对字段进行升序排序:

$ mlr --csv clean-whitespace then sort-within-records file
adress,mobile-number,name
USA,12121212,Ane
England,234234,Joane

答案2

我们能做的就是使用以下命令将列转置为行:rs源自 BSD Unix 的实用程序,然后只是sort行(因此,有效地对原始数据的列进行排序),然后再次转置。

首先,请注意,按字母顺序排列,它是:地址、手机号码、姓名。 M 在 N 之前!

一步步:

$ cat data
name  ,adress  ,mobile-number
Ane   ,USA     ,12121212
Joane ,England ,234234

$ rs -s, -C, -T < data
name  ,Ane   ,Joane ,
adress  ,USA     ,England ,
mobile-number,12121212,234234,

$ rs -s, -C, -T < data | sort
adress  ,USA     ,England ,
mobile-number,12121212,234234,
name  ,Ane   ,Joane ,

$ rs -s, -C, -T < data | sort | rs -s, -C, -T
adress  ,mobile-number,name  ,
USA     ,12121212,Ane   ,
England ,234234,Joane ,

$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T
adress         mobile-number  name  
USA            12121212       Ane   
England        234234         Joane 

最后:

$ rs -s, -C, -T < data | sort | rs -s, -S' ' -T | sed -e 's/ \([^ ]\)/,\1/g'
adress        ,mobile-number ,name  
USA           ,12121212      ,Ane   
England       ,234234        ,Joane 

我在 Ubuntu GNU/Linux 上做到了这一点,首先必须sudo apt-get install rs.

答案3

使用(以前称为 Perl_6)

~$ raku -MText::CSV -e 'my @dta = csv(in => $*IN, sep => ",", strict => True)>>.trim;   \
         my $index = @dta.[0].pairs.sort(*.value).map: *.key;           \
         @dta.=map( *.[$index.cache]); csv(in => @dta, out => $*OUT);'  file

Raku 是 Perl 家族中的一种编程语言,具有高级 Unicode 支持。上面,该语言在命令行中与 Raku 的模块一起使用Text::CSV

示例输入:

name  ,adress  ,mobile-number
Ane   ,USA     ,12121212
Joane ,England ,234234

示例输出:

adress,mobile-number,name
USA,12121212,Ane
England,234234,Joane

简而言之,使用方法/函数读入数据csv(...),使用 删除条目周围的空格trim,并将其存储在 @dta数组中。 An是通过将条目转换为 numbered 、ing by ,然后获取排序后的 numeric来从 的第一行$index生成的。然后用重新排序的列覆盖。最后,一个文件被放到标准输出上。[0]@dtapairssortvaluekey@dta.=$indexcsvout$*OUT

注意:删除对的调用>>.trim将返回双引号引起来的列值,其中条目包含尾随空格,根据RFC 4180。通过添加.reverse索引代码来反转列排序顺序,如 中所示[$index.cache.reverse]

>>.trim不带和带的示例输出.reverse

"name  ",mobile-number,"adress  "
"Ane   ",12121212,"USA     "
"Joane ",234234,"England "

https://github.com/Tux/CSV/blob/master/doc/Text-CSV.md
https://docs.raku.org
https://raku.org

相关内容