CSV 파일의 열 정렬

CSV 파일의 열 정렬

CSV 파일에서 모든 열을 열 이름별로 정렬하려고 합니다. 내가 가진 것은 이것입니다:

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

내가 필요한 출력은

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

문제는 열이 3개 이상 있고 정렬 순서를 모르지만 오름차순으로 다시 정렬해야 한다는 것입니다.

답변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

우리가 할 수 있는 일은 다음을 사용하여 열을 행으로 바꾸는 것입니다.rsBSD 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 제품군의 프로그래밍 언어입니다. 위의 언어는 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배열에 저장하는 데 사용합니다. 항목을 번호 매기기로 변환하고 ing by로 정렬한 다음 정렬된 숫자를 가져오는 방식으로 의 첫 번째 행에서 An이 $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

관련 정보