web-dev-qa-db-ja.com

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

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

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

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

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

47
Steven D

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

簡単な例:

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

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

http://csvkit.readthedocs.org/

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

  • cSVファイルの再フォーマット、
  • さまざまな形式(JSON、SQL、XLS)からCSVへ、またはCSVから変換
  • cutgrepsortなどと同等ですが、CSV対応です。
  • 異なるCSVファイルを結合する、
  • cSVファイルのデータに対して一般的なSQLクエリを実行します。
40
romaia

Text::CSV を使用したPerlの仕事のように聞こえます。

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

列名の処理方法については、ドキュメントを参照してください。セパレータと引用スタイルは、newへのパラメータで調整できます。区切り文字の推測については Text::CSV::Separator もご覧ください。

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

http://neilb.bitbucket.org/csvfix

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

10
Daniel Burke

コマンドラインを使用したい場合(そしてジョブを実行するためのプログラム全体を作成しない場合)、 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

次に rows は、次のように美しい方法で内容を出力します。

+-------+-------------------------------+-------------+---------+
| 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 Library

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

楽しんでください!

8
Álvaro Justen

csvtool を1回使用しましたが、時間と手間を大幅に節約できました。シェルから呼び出し可能。

http://caml.inria.fr/cgi-bin/hump.en.cgi?contrib=447

6
nat

[〜#〜] 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'

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

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

> help(read.csv)
6
Faheem Mitha

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

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

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

3
rvs

cissy はコマンドラインのcsv処理も行います。 C(小/軽量)で書かれており、ほとんどのディストリビューションで使用できるrpmおよびdebパッケージが含まれています。

例を使用すると:

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
3
slass100

xsv-RustGithub )で記述された高速CSVコマンドラインツールキットをお勧めします。

Ripgrep の作者によって書かれました。

CSV処理を142倍高速化した方法Redditスレッド )で紹介されました。

3
Nicolas Girard

「csvtool」を試してください。このパッケージは、CSVファイルを処理するための便利なコマンドラインツールです。

2
dominic

コマンドラインからpythonを使用するには、pythonpy( https://github.com/Russell91/pythonpy )をチェックアウトできます。

$ echo $'a,b,c\nd,e,f' | py '[x[1] for x in csv.reader(sys.stdin)']
b
e
2
RussellStewart

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

Github repo Structured Text Tools には、関連するLinuxコマンドラインツールの便利なリストがあります。特に、 区切り文字で区切られた値 セクションには、要求された操作を直接サポートするいくつかのCSV対応ツールがリストされています。

1
JonDeg

ターミナルでビジュアル/インタラクティブツールが必要な場合は、VisiDataを心からお勧めします。

enter image description here

頻度表(上記を参照)、ピボット、融解、散布図、Pythonを使用したフィルタリング/計算などがあります。

あなたはそのようにcsvファイルを渡すことができます

vd hello.csv

Csv固有のオプションがあります:--csv-dialect--csv-delimiter--csv-quotechar--csv-skipinitialspace csvファイルの微調整された処理。

1
DameDebugger

CSV形式でファイルを読み書きするための Curry ライブラリもあります [〜#〜] csv [〜#〜]

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
0
Srini