
perlで容量の大きいCSVファイルを開く方法
ファイル容量の大きいcsvファイルから、必要な項目を抜き出して別ファイルにするプログラムを作成したいと思ってます。
csvファイルが少ない場合は動作したのですが、容量が140MBを超えたデータを読み込もうとすると、ブラウザー表示で何も変化いたしません
プログラムは以下のようになってます。
-------------------------------------------------
略
open(IN,"$inport") || &error(" $inport を読み込みopen出来ません");
flock(IN,1);
@lines = <IN>;
foreach $lines (@lines) {
local(@val) = split("\,", $lines);
print "$val[0]";
$dat .= "$val[1]\,$val[5]\n";
}
open(OUT,">$dcsv");
flock(OUT,2);
print OUT "$dat";
close OUT;
略
-------------------------------------------------
件数も多いので、foreachを$lines (@lines) としないで($start .. $end)として読み込みの件数を制限して対応しようと考えてましたが、うまくいきませんでした。
ご指導いただけますと幸いです。
No.2ベストアンサー
- 回答日時:
質問者さんのコードは
> @lines = <IN>;
ここで、ファイルの全データを変数に読み込んで
> foreach $lines (@lines) {
これで、データを1つづつ取り出す
という処理になっていますので、「@lines=<IN>」の時点でメモリを大量に消費します。この2行の代わりに
> while ($lines = <IN>) {
とすれば、ファイルから1行ずつデータを読んで処理するようになりますので、
ファイルサイズが大きくても処理できるようになります。
ただし、そうやったとしても、
> $dat .= "$val[1]\,$val[5]\n";
この部分で変数 $dat のサイズがどんどん大きくなりますから、そちらの分のメモリ消費は入力ファイルサイズに比例します。
---
open(IN,"$inport") || &error(" $inport を読み込みopen出来ません");
flock(IN,1);
open(OUT,">$dcsv");
flock(OUT,2);
while ($lines = <IN>) {
local(@val) = split("\,", $lines);
print "$val[0]";
print OUT "$val[1]\,$val[5]\n";
}
close IN;
close OUT;
---
とすれば、完全に入力ファイルサイズに依存しないようになります。
回答ありがとうございます。
具体的な方法までご指導いただきとても助かりました。
早速やってみたところ無事動作いたしました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
2つのCSVファイルをマッチング
-
openした後、closeしないでプロ...
-
Javaで同一のファイルを読み込...
-
MATLAB グローバル変数の宣言
-
マッチした行の上の行を抽出
-
JavaでCSVファイルを高速に読む...
-
Excelマクロでフォルダ内のCSV...
-
CSVが可変長の場合の検索方法
-
範囲演算子と文字列マッチング...
-
エクセルマクロについて CSVフ...
-
open() で開くだけで破損するか
-
テキストデータから指定した1...
-
他のサーバーにあるファイルの...
-
ReadLineでの読み出し行を指定する
-
CSVファイルの内容を編集する方...
-
画像をバイナリデータに変換す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
MATLAB グローバル変数の宣言
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルの特定行を書...
-
VBAで巨大なファイルの途中から...
-
openした後、closeしないでプロ...
-
ReadLineでの読み出し行を指定する
-
VBScriptでファイル保存先のデ...
-
JavaでCSVファイルを高速に読む...
-
perlにて2つのファイル比較
-
CSVが可変長の場合の検索方法
-
拡張子 ”log” と ” dat” の違い
-
Perlの変数に文字数制限(容量...
-
合致する番号のデータを抽出す...
-
C言語でのファイルのデータ更...
-
perlで、後ろの行を読んで、前...
-
Perlを改造してエラーチェック...
-
csvファイル改行コードの置換に...
-
perlで容量の大きいCSVファイル...
おすすめ情報