aaa.txt
06011800, 5.3
06012100, 5
06020000, 4.5
06020300, 6.2
…
bbb.txt
06011800, 5.1
06012100, 7.5
06020000, 5.1
06020300, 9.3
…
という二つのファイルがあります。
以下のプログラムを用いて、
06011800, 5.3, 5.1
06012100, 5, 7.5
06020000, 4.5, 5.1
06020300, 6.2, 9.3
…
といった感じでデータを作る事に成功したのですが、どうしてもループに無駄が多く、時間がかかってしまいます。
連想配列などを使えば時間が短縮出来そうなのですが、よくわかりません。
ご教示いただけないでしょうか。
以下、作成したプログラム。
$csvfile1 = $ARGV[0];
$csvfile2 = $ARGV[1];
open(DAT1, $csvfile1) || die $!;
while($line=<DAT1>) {
chomp($line);
@dat = split(/,/,$line);
open(DAT2, $csvfile2) || die $!;
while($line2=<DAT2>) {
chomp($line2);
@dat2 = split(/,/,$line2);
if($dat[0] == $dat2[0]){
print "$dat[0],$dat[1],$dat2[1]\n";
}
}
}
close(DAT);
No.3ベストアンサー
- 回答日時:
あなたがつくられたスクリプトをできるだけ生かすようにして連想配列を
つかったスクリプトを作成しました。
いかのようになります。
-------------------------------------------------------------
$csvfile1 = $ARGV[0];
$csvfile2 = $ARGV[1];
#$csvfile1全体を一気に読み込む
open(DAT1, $csvfile1) || die $!;
@lines1=<DAT1>;
close (DAT1);
#$csvfile2全体を一気に読み込む
open(DAT2, $csvfile2) || die $!;
@lines2=<DAT2>;
close (DAT2);
#$csvfile1から連想配列を作る
foreach $line (@lines1){
chomp $line;
@data = split(/,/,$line);
$hash1{$data[0]} = $data[1];
}
#$csvfile2から連想配列を作る
foreach $line (@lines2){
chomp $line;
@data = split(/,/,$line);
$hash2{$data[0]} = $data[1];
}
#以下$csvfile1のデータを元にして出力する処理
#$csvfile1の連想配列のキーだけを取り出す、そしてソートする
@key1 = sort(keys(%hash1));
#取り出したキーを1つずつ処理する
foreach $key (@key1){
#第1列目のデータが$csvfile1,$csvfile2の両方に存在するものだけ出力する
if (exists($hash2{$key})){
print $key,",",$hash1{$key},",",$hash2{$key},"\n";
}
}
-------------------------------------------------------------
尚、第1列目のデータが両方のファイルにあるものだけを出力しています。
例えば、aaa.txtの1行目
06011800, 5.3
の06011800がbbb.txtに無い場合は、そのデータは出力しません。
(逆のケースも同様です)
No.4
- 回答日時:
Unix コマンドなら、
join -t, aaa.txt bbb.txt
と、この処理に適したコマンドが既に存在しています。
両方のレコードにあるものを出力するとすると、
例えば、こんな感じでしょうか。
http://pastebin.com/xz9dPGXy
片方だけのものを出力して良いなら、
while (<$csv2>) {...}
の中の else 側の処理をコメントにします。さらに、出力部分の、next の行をコメントにします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- MySQL MYSQL エラー 2 2022/10/18 11:37
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- Java JaneStyleのスレッドが見れなくなった 1 2023/06/10 08:02
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
- 工学 ちなみになぜv=(v・e1)e1+(v・e2)e2はe1やe2が、正規直交基底でないと成り立たないと 2 2022/12/22 17:22
- Excel(エクセル) Excel2007での条件付き書式について 6 2023/05/02 10:56
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
Windows10においての『Perl』の...
-
アルファベットに付いて質問し...
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
VBA変数をFunction.VLookupの戻...
-
Unity5について質問です。 私は...
-
perlのflock関数でロックをかけ...
-
ラズベリーパイ初心者です。 ラ...
-
Perlのエラーについてご教授く...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
perlでリテラル値はメモリにど...
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
-
perlのプログラミング 部分入れ...
-
Blenderについて
-
Perlで特定文字列から特定文字...
-
TeraPadエディターの操作方法に...
-
Perl 数値にスラッシュを入れる...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
perlをバージョンアップしたら...
-
openした後、closeしないでプロ...
-
Perlで特定文字列から特定文字...
-
Wallpaper Engineでおすすめの...
-
Perlのエラーについてご教授く...
-
アルファベットに付いて質問し...
-
Strawberry Perl for Windows ...
-
bashスクリプト
-
テキストファイルで提出とは?
-
Perl の外部モジュールの利用方法
-
#!/usr/bin/perlで書きだしたCG...
-
Windows10においての『Perl』の...
-
perlのflock関数でロックをかけ...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
画像が表示でnull; this.src
-
ターミナルで特定の文字と文字...
-
英数文字列のうちの数値を4桁に...
おすすめ情報