CSV 파일을 처리하기위한 강력한 명령 줄 도구가 있습니까?


47

CSV 파일로 작업하며 명령 줄에서 행 또는 열의 내용을 빠르게 확인해야하는 경우가 있습니다. 많은 경우 cuthead,, tail친구가 일을합니다. 그러나 컷은 다음과 같은 상황을 쉽게 처리 할 수 ​​없습니다.

"this, is the first entry", this is the second, 34.5

여기서 첫 번째 쉼표는 첫 번째 필드의 일부이지만 cut -d, -f1동의하지 않습니다. 솔루션을 직접 작성하기 전에 누군가이 작업에 이미 유용한 도구를 알고 있는지 궁금했습니다. 최소한 위의 예를 처리하고 CSV 형식의 파일에서 열을 반환 할 수 있어야합니다. 다른 바람직한 기능으로는 첫 번째 행에 주어진 열 이름을 기반으로 열을 선택하는 기능, 다른 인용 스타일 지원 및 탭으로 구분 된 파일 지원이 있습니다.

그러한 도구를 모르지만 Bash, Perl 또는 Python 또는 다른 일반적인 스크립팅 언어로 그러한 프로그램을 구현하는 것에 대한 제안이 있으면 그러한 제안을 신경 쓰지 않을 것입니다.

답변:


38

파이썬 csv모듈을 사용할 수 있습니다 .

간단한 예 :

import csv
reader = csv.reader(open("test.csv", "r"))
for row in reader:
    for col in row:
        print col

내 최종 솔루션은 Perl이 너무 녹슨 이후 파이썬이었습니다. 감사.
Steven D

2
더 좋은 것은 Pandas를 사용하십시오 . 테이블 형식의 데이터로 작동하도록 명시 적으로 설계되었습니다.
Josh

38

아마 너무 늦었지만 언급 할 가치가있는 또 다른 도구가 있습니다 : csvkit

http://csvkit.readthedocs.org/

다음과 같은 많은 명령 줄 도구가 있습니다.

  • CSV 파일 재 포맷
  • 다양한 형식 (JSON, SQL, XLS)의 CSV로 변환하거나 CSV에서 변환
  • 의 동등한 cut, grep, sort등,하지만 CSV 인식,
  • 다른 CSV 파일에 가입
  • CSV 파일의 데이터에 대한 일반적인 SQL 쿼리를 수행합니다.

6
질문 기준을 훌륭하게 충족시키는 훌륭한 도구입니다 (특히 프로그래밍 언어로 뛰어들 필요가 없으며 다른 유닉스 유틸리티에 맞게 잘 제작되었습니다).
mm2001

15

와 Perl의 직업인 것 같습니다 Text::CSV.

perl -MText::CSV -pe '
    BEGIN {$csv = Text::CSV->new();}
    $csv->parse($_) or die;
    @fields = $csv->fields();
    print @fields[1,3];
'

열 이름을 처리하는 방법에 대한 설명서를 참조하십시오. 구분 기호 및 인용 스타일은에 매개 변수를 사용하여 조정할 수 있습니다 new. Text::CSV::Separator구분자 추측 도 참조하십시오 .


이것을 압축 할 수있는 하나의 라이너가 있습니까? 나는 perl을 좋아하지만 스크립트 대신 명령 줄에서 직접 호출 할 수있을 때만
Sridhar Sarnobat

2
쉘이 (t)csh그 명령이 아니라면 @ user7000은 쉘 의 프롬프트에서 잘 작동합니다. 한 줄에 원하는 경우 언제든지 해당 줄을 결합 할 수 있습니다. 줄 바꿈은 일반적으로 C와 같은 펄 구문의 공간과 같습니다.
Stéphane Chazelas

나는 추측한다. 2 줄 이상을 1로 스쿼시하는 것이 실제로 하나의 라이너가 의미하는 것은 아닙니다. 나는 암시 적으로 일부를 수행하는 구문 설탕이 있기를 바랐습니다 ( -e암시 적 루프를 만드는 방법과 같이 ).
Sridhar Sarnobat

10

명령 줄 도구 인 csvfix가 제대로 작동합니다. 그러나 직접 작성해야합니다.

http://neilb.bitbucket.org/csvfix

CSV 데이터에서 SQL 삽입을 생성하고 CSV 데이터를 확산시키는 것을 원하지 않는 모든 항목, 순서 / 선택 열, 분할 / 병합을 수행합니다.


8

명령 줄을 사용하고 (작업을 수행하기 위해 전체 프로그램을 만들지 않으려는 경우) 작업중 인 프로젝트 rows 을 사용하고 싶습니다 : 테이블 형식의 데이터에 대한 명령 줄 인터페이스이지만 프로그램에서 사용할 파이썬 라이브러리. 명령 행 인터페이스를 사용하면 간단한 명령으로 라이브러리에서 지원하는 CSV, XLS, XLSX, HTML 또는 기타 테이블 형식의 모든 데이터를 예쁘게 인쇄 할 수 있습니다.

rows print myfile.csv

myfile.csv이 같은 경우 :

state,city,inhabitants,area
RJ,Angra dos Reis,169511,825.09
RJ,Aperibé,10213,94.64
RJ,Araruama,112008,638.02
RJ,Areal,11423,110.92
RJ,Armação dos Búzios,27560,70.28

그런 다음 은 다음 과 같이 아름다운 방식으로 내용을 인쇄합니다.

+-------+-------------------------------+-------------+---------+
| state |              city             | inhabitants |   area  |
+-------+-------------------------------+-------------+---------+
|    RJ |                Angra dos Reis |      169511 |  825.09 |
|    RJ |                       Aperibé |       10213 |   94.64 |
|    RJ |                      Araruama |      112008 |  638.02 |
|    RJ |                         Areal |       11423 |  110.92 |
|    RJ |            Armação dos Búzios |       27560 |   70.28 |
+-------+-------------------------------+-------------+---------+

설치

파이썬 개발자이고 이미 pip컴퓨터에 설치되어 있다면 virtualenv 내부에서 또는 다음을 사용하여 실행하십시오 sudo.

pip install rows

데비안을 사용하는 경우 :

sudo apt-get install rows

다른 멋진 기능

형식 변환

지원되는 형식간에 변환 할 수 있습니다.

rows convert myfile.xlsx myfile.csv

쿼리

예, SQL을 CSV 파일로 사용할 수 있습니다.

$ rows query 'SELECT city, area FROM table1 WHERE inhabitants > 100000' myfile.csv
+----------------+--------+
|      city      |  area  |
+----------------+--------+
| Angra dos Reis | 825.09 |
|       Araruama | 638.02 |
+----------------+--------+

--output매개 변수를 사용하여 조회 출력을 stdout 대신 파일로 변환 할 수도 있습니다 .

파이썬 라이브러리로서

파이썬 프로그램에서도 가능합니다.

import rows
table = rows.import_from_csv('myfile.csv')
rows.export_to_txt(table, 'myfile.txt')
# `myfile.txt` will have same content as `rows print` output

즐기 셨으면 좋겠습니다!


6

R 은 제가 가장 좋아하는 프로그래밍 언어는 아니지만 이런 것들에 좋습니다. CSV 파일이

***********
foo.csv
***********
 col1, col2, col3
"this, is the first entry", this is the second, 34.5
'some more', "messed up", stuff

R 인터프리터 유형 내부

> x=read.csv("foo.csv", header=FALSE)

> x
                     col1                col2   col3
1 this, is the first entry  this is the second   34.5
2              'some more'           messed up  stuff
> x[1]  # first col
                      col1
1 this, is the first entry
2              'some more'
> x[1,] # first row
                      col1                col2  col3
1 this, is the first entry  this is the second  34.5

다른 요청과 관련하여 "첫 번째 행에 제공된 열 이름을 기반으로 열을 선택하는 기능"에 대해서는

> x["col1"]
                      col1
1 this, is the first entry
2              'some more'

"다른 인용 스타일 지원"에 대해서는 quoteread.csv (및 관련 함수)에 대한 인수를 참조하십시오 . "탭으로 구분 된 파일 지원"에 대해서는 sepread.csv에 대한 인수 ( sep'\ t'로 설정) 를 참조하십시오 .

자세한 내용은 온라인 도움말을 참조하십시오.

> help(read.csv)

나는 R에 매우 익숙하지만 내 목표는 Bash에서 쉽게 사용할 수있는 것을 갖는 것이 었습니다.
Steven D

1
@Steven : 유일한 관심사 인 경우 Python 또는 Perl과 같은 방식으로 명령 줄에서 R을 쉽게 실행할 수 있습니다. 참조 Rscript(기본 R 분포의 일부) 또는 애드온 패키지를 littler. 할 수 #!/usr/bin/env Rscript있거나 비슷합니다.
Faheem Mitha

아. 넵. 나는 R에 능숙하지만이 유틸리티 유형을 만드는 데 많이 사용하지 않았습니다. 파이썬에서 작동하는 것이 있지만 R에서도 무언가를 만들려고 할 수 있습니다.
Steven D


4

Miller 는 CSV (헤더 포함)를 포함하여 이름 기반 데이터를 조작 할 수있는 훌륭한 도구입니다. 이름을 신경 쓰지 않고 CSV 파일의 첫 번째 열을 추출하려면 다음과 같은 작업을 수행하십시오

printf '"first,column",second,third\n1,2,3\n' |
  mlr --csv --implicit-csv-header --headerless-csv-output cut -f 1

밀러는 매우 인상적입니다. 나는 그것을 awkDSV를 잘 알고 있지만 비교할 것 입니다.
Derek Mahar

3

또는, 당신은 awk 마술을 시도 할 수 있습니다. Howewer, 나는 좋은 awk 사용자가 아니며 이것이 제대로 작동하는지 확인할 수 없으며 어떻게 해야하는지.


9
다음은 내가 한동안 사용했던 awk CSV 파서입니다. 꽤 잘 생각해 보입니다 ... lorance.freeshell.org/csv
Peter.O



2

"csvtool"이 패키지를 사용해보십시오 CSV 파일을 처리하기위한 편리한 명령 줄 도구입니다


1
자세한 내용은 이미 언급했습니다 ...
jasonwryan

2

cissy 는 명령 줄 csv 처리도 수행합니다. 대부분의 배포판에서 사용할 수있는 rpm 및 deb 패키지와 함께 C (작은 / 경량)로 작성되었습니다.

예제를 사용하여 :

echo '"this, is the first entry", this is the second, 34.5' | cissy -c 1
"this, is the first entry"

또는

echo '"this, is the first entry", this is the second, 34.5' | cissy -c 2
 this is the second

또는

echo '"this, is the first entry", this is the second, 34.5' | cissy -c 2-
 this is the second, 34.5

1

CSV 형식의 파일 읽기 / 쓰기를위한 Curry 라이브러리 도 있습니다 : CSV .


2
Perl, Python 및 R 답변과 같은 샘플 코드를 게시 하시겠습니까? (특히 Curry는 일반적인 유닉스 스크립팅 언어가 아니기 때문에.)
Gilles 'SO-stop

@ Gilles : 예, 맞습니다. 답변을 개선하기 위해 샘플 코드를 게시해야합니다. 나는 이것을 잠시 동안 할 것입니다.
imz-Ivan Zakharyaschev



1

가장 좋은 도구 중 하나는 Miller입니다 ( http://johnkerl.org/miller/doc/index.html ). CSV, TSV 및 테이블 형식 JSON과 같은 이름 색인 데이터의 경우 awk, sed, cut, join 및 sort와 같습니다.

예를 들어

echo '"this, is the first entry", this is the second, 34.5' | \
mlr --icsv --implicit-csv-header cat

너에게 준다

1=this, is the first entry,2= this is the second,3= 34.5

TSV를 원한다면

echo '"this, is the first entry", this is the second, 34.5' | \
mlr --c2t --implicit-csv-header cat

당신에게 제공합니다 (헤더를 제거 할 수 있습니다)

1       2       3
this, is the first entry         this is the second      34.5

첫 번째와 세 번째 열을 원하면 순서를 변경하십시오.

echo '"this, is the first entry", this is the second, 34.5' | \
mlr --csv --implicit-csv-header --headerless-csv-output cut -o -f 3,1

너에게 준다

 34.5,"this, is the first entry"

1

터미널에서 시각적 / 대화 형 도구를 원한다면 VisiData를 진심으로 추천합니다.

여기에 이미지 설명을 입력하십시오

빈도 표 (위 그림 참조), 피벗, 용융, 산점도, Python을 사용한 필터링 / 계산 등이 있습니다.

당신은 그렇게 CSV 파일을 전달할 수 있습니다

vd hello.csv

특정 옵션은 CSV있다 : --csv-dialect, --csv-delimiter, --csv-quotechar, 및 --csv-skipinitialspaceCSV 파일의 미세 조정 처리합니다.


0

awk 솔루션

awk -vq='"' '
func csv2del(n) {
  for(i=n; i<=c; i++)
    {if(i%2 == 1) gsub(/,/, OFS, a[i])
    else a[i] = (q a[i] q)
    out = (out) ? out a[i] : a[i]}
  return out}
{c=split($0, a, q); out=X;
  if(a[1]) $0=csv2del(1)
  else $0=csv2del(2)}1' OFS='|' file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.