「Perlによる巨大CSVファイルの操作について」の版間の差分

提供: dococo wiki
ナビゲーションに移動 検索に移動
imported>Webmaster
imported>Webmaster
5行目: 5行目:
 
条件抽出したり、いろいろなことをPerlをつかってできないかと思っております<br />
 
条件抽出したり、いろいろなことをPerlをつかってできないかと思っております<br />
 
== データ処理について ==
 
== データ処理について ==
本来、このようなデータを処理するにはSQLサーバにデータを入れてSELECTで必要データの抽出などを行えば良いのですが、クライアントでSQLサーバなんかインストール出来ないし(業務用パソコンにソフトのインストールが出来ない設定になっている)、Accessを使えばデータをインポートできるけど並べ替えすら劇悪阻
+
本来、このようなデータを処理するにはSQLサーバにデータを入れてSELECTで必要データの抽出などを行えば良いのですが、クライアントでSQLサーバなんかインストール出来ないし(業務用パソコンにソフトのインストールが出来ない設定になっている)、Accessを使えばデータをインポートできるけど並べ替えすらとても遅かったのでちょっと使えないかな、と思っています。<br />
 +
自分の業務ではそこまで手の込んだことは行わないので単純なデータ処理を行い、グラフ化等はEXCELで実施できれば良いと思ってPerlでなんか出来ないかと思い調べて見ました。<br />
  
 
== File::Sortモジュール ==
 
== File::Sortモジュール ==

2017年10月27日 (金) 21:59時点における版

仕事上、CSVファイルで出力されたデータ整理をしているが。最近ではデータが巨大になりついにEXCELでは処理しきれないデータ量になった。要するに100万行を超えたわけである。しかしながら、データ出力はCSVで出てくるのでなんとかPerlによる巨大CSVファイルの操作が出来るかどうか検討してみた。

巨大CSVファイルの操作

巨大ってどれくらいかというと、大体100万行~1000万行程度のテキストCSVファイルを指しており。操作というのはあるキーを元にしてソート(並び替え)や重複ファイルの削除を考えています。
もっと欲を言えば、1000万行や1億行のデータからある条件でピボットテーブル(クロス集計)で中央値を出したり、平均値を出したり。
条件抽出したり、いろいろなことをPerlをつかってできないかと思っております

データ処理について

本来、このようなデータを処理するにはSQLサーバにデータを入れてSELECTで必要データの抽出などを行えば良いのですが、クライアントでSQLサーバなんかインストール出来ないし(業務用パソコンにソフトのインストールが出来ない設定になっている)、Accessを使えばデータをインポートできるけど並べ替えすらとても遅かったのでちょっと使えないかな、と思っています。
自分の業務ではそこまで手の込んだことは行わないので単純なデータ処理を行い、グラフ化等はEXCELで実施できれば良いと思ってPerlでなんか出来ないかと思い調べて見ました。

File::Sortモジュール

File::Sortはファイルの内容を行単位でソートし,別のファイルへ出力する。機能ですか使ってみると以下の機能があることがわかりました

  • ある区切りを基準にしてソート(並び替え)をして別のファイルへ出力する
  • 複数のファイルをマージして別のファイルへ出力する
  • ある区切りを基準にた重複行を削除して別のファイルへ出力する

テストベットで試験をしたら1000万行のソート(並び替え)は90分で完了しました。
これはFile::Sortモジュールを使用することで巨大CSVファイルの並び替えや操作が可能ということがわかりました。

使い方

アルファベット順に並び替え

OPEN等使わないで、直接ファイルを指定してやれば勝手に該当ファイルをオープンして読み取り、出力ファイルに吐き出す。非常に単純明快な使い方。

	sort_file({
	 I => "c:\Input.txt",	#入力ファイル名
	 o => "c:\Output.txt",	#出力ファイル名(ソート)
	});

重複行を削除する

ある列を基準にして重複行を削除する

	#重複ファイルを削除する
	sort_file({
	t => ",",#フィールド区切り文字
	I => "c:\Input.txt",	#入力ファイル名
	k => 1,#何列目をキーとしてソートをするか?
	y => 1000000, # MAX_SORT_RECORDS 
	u => 1,#重複カット
	o => "c:\Output.txt",	#出力ファイル名(ソート)
	});