csvファイルを処理するための堅牢なコマンドラインツールはありますか?


47

CSVファイルを使用していますが、コマンドラインから行または列の内容をすばやく確認する必要がある場合があります。多くの場合cutheadtail、と友人が仕事をします。ただし、cutは次のような状況に簡単に対処できません。

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

ここでは、最初のコンマは最初のフィールドの一部ですが、cut -d, -f1一致しません。自分で解決策を書く前に、この仕事のためにすでに存在する優れたツールを誰かが知っているかどうか疑問に思っていました。少なくとも、上記の例を処理し、CSV形式のファイルから列を返すことができる必要があります。他の望ましい機能には、最初の行に指定された列名に基づいて列を選択する機能、他の引用スタイルのサポート、およびタブ区切りファイルのサポートが含まれます。

そのようなツールを知らないが、そのようなプログラムをBash、Perl、Python、または他の一般的なスクリプト言語で実装することに関する提案がある場合、私はそのような提案を気にしません。

回答:


38

Pythonのcsvモジュールを使用できます。

簡単な例:

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

Perlがさびていたので、私の最終的な解決策はpythonでした。ありがとう。
スティーブンD

2
さらに良いことに、Pandasを使用します。表形式のデータで動作するように明示的に設計されています。
ジョシュ14

38

私はおそらく少し遅すぎますが、言及する価値のある別のツールがあります:csvkit

http://csvkit.readthedocs.org/

次のことができるコマンドラインツールがたくさんあります。

  • CSVファイルの再フォーマット、
  • さまざまな形式(JSON、SQL、XLS)からCSVへ、またはCSVから変換します。
  • 相当cutgrepsortなどが、CSV-意識し、
  • さまざまなCSVファイルを結合し、
  • CSVファイルのデータに対して一般的なSQLクエリを実行します。

6
質問の基準を素晴らしく満たす優れたツール(特に、プログラミング言語に飛び込む必要はなく、他のUnixユーティリティに適合するように巧妙に作成されています)。
mm2001 14年

15

Perlでの仕事のように聞こえText::CSVます。

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

列名の処理方法については、ドキュメントを参照してください。セパレータとクォートのスタイルは、パラメータを使用して調整できますnewText::CSV::Separatorセパレータの推測も参照してください。


これを圧縮できるライナーが1つあります。I perlのように、私は、コマンドラインからではなく、スクリプトを直接呼び出すことができた場合にのみ
シュリダールSarnobat

2
@ user7000、シェルが(t)cshそのコマンドである場合を除き、コマンドはシェルのプロンプトで正常に機能します。1行で必要な場合は、いつでもこれらの行を結合できます。改行は、一般的にCのようなperl構文のスペースのようなものです。
StéphaneChazelas

私は推測する。2行以上を1行に詰めることは、ライナーが1つという意味ではありません。暗黙的に(-e暗黙的なループを作成する方法など)の一部を実行する構文糖が存在することを期待していました。
スリダールサルノバト

10

コマンドラインツールがうまく機能するcsvfixを見つけました。ただし、自分で作成する必要があります。

http://neilb.bitbucket.org/csvfix

期待するすべてのこと、列の順序/選択、分割/マージ、およびCSVデータからのSQL挿入の生成とCSVデータの比較を望まない多くのことを行います。


8

コマンドラインを使用したい(そしてプログラム全体を作成してジョブを実行したくない)場合は、私が取り組んでいるプロジェクトrowsを使用したいと思います:それは表データへのコマンドラインインターフェースですが、プログラムで使用するPythonライブラリ。コマンドラインインターフェイスを使用すると、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 |
+-------+-------------------------------+-------------+---------+

インストール中

あなたがPython開発者であり、すでにpipマシンにインストールされている場合は、virtualenv内で実行するか、sudo次のコマンドで実行します。

pip install rows

Debianを使用している場合:

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ではなくファイルに変換することもできます。

Pythonライブラリとして

Pythonプログラムでも次のことができます。

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'

「他の引用スタイルのサポート」についてはquote、read.csv(および関連する関数)への引数を参照してください。「タブ区切りファイルのサポート」についてはsep、read.csv の引数(sep「\ t」に設定)を参照してください。

詳細については、オンラインヘルプを参照してください。

> help(read.csv)

私はRに非常に精通していますが、私の目標はBashから簡単に使用できるものを持つことでした。
スティーブンD

1
@Steven:Rは、PythonまたはPerlと同じように、コマンドラインから簡単に実行できます。Rscript(ベースRディストリビューションの一部)またはアドオンパッケージを参照してくださいlittler。あなたが行うことができます#!/usr/bin/env Rscriptまたは同様。
ファヒムミタ

ああ、はい。私はRにはかなり習熟していますが、このタイプのユーティリティを作成するためにRをあまり使用していませんでした。Pythonで動作するものがありますが、Rでも何かを作成しようとする場合があります。
スティーブンD


4

Millerは、CSV(ヘッダー付き)などの名前ベースのデータを操作するためのもう1つの優れたツールです。名前を気にせずにCSVファイルの最初の列を抽出するには、次のようにします。

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

ミラーはとても印象的です。と比較しますがawk、高度にDSVに対応しています。
デレクマハール

3

または、awkマジックを試すこともできます。しかし、私はawkユーザーではないので、これが適切に機能するかどうか、およびその方法を確認できません。


9
ここで1はCSVパーサ私はしばらく前に...それは非常によく考えられているようだ...使用awkはある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形式でファイルを書き込むためのライブラリCSVが


2
Perl、Python、Rの回答などのサンプルコードを投稿してもよろしいですか?(特に以来カレーは、一般的なUNIXスクリプト言語ではありません。)
ジル「SO-停止さ悪」

@Gilles:はい、その通りです。回答を改善するために、サンプルコードを投稿する必要があります。しばらくしてこれを行うつもりです。
imz-イワンザカリヤシェフ



1

最良のツールの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

1列目と3列目が必要な場合は、順序を変更します

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-skipinitialspace用のCSVファイルの取り扱い微調整。


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.