Perlで2つのテキストファイルの処理する方法

このQ&Aのポイント
  • Perlで2つのテキストファイルを処理する方法について
  • 2つのテキストファイルをPerlで処理する方法について解説します
  • Perlを使用して2つのテキストファイルを処理する方法を詳しく説明します
回答を見る
  • ベストアンサー

Perlで2つのテキストファイルの処理する方法

めぐみです。 tatsu99さま、以下のプログラムを親切にアドバイス頂きまして本当にありがとうございました。 追記で質問させて頂きたいことがあります。 --------------------------------------------------------------- $file_a = shift(@ARGV); $file_b = shift(@ARGV); open FHA,$file_a or die("can't open $file_a"); @data_a = (); while($line=<FHA>){ chomp($line); push @data_a,$line } close FHA; open FHB,$file_b or die("can't open $file_b"); @data_b = (); while($line=<FHB>){ chomp($line); push @data_b,$line } close FHB; foreach $da (@data_a){ printf("%s%d%d%d\n",$da,$data_b[0],$data_b[1],$data_b[2]); printf("%s%d\n",$da,$data_b[0]); printf("%s%d%d\n",$da,$data_b[1],$data_b[2]); printf("%s\n",$da); printf("%s%04d%02d%02d\n",$da,$data_b[0],$data_b[1],$data_b[2]); printf("%s%02d%02d\n", $da,$data_b[1],$data_b[2]); printf("%d%d%d%s\n",$data_b[0],$data_b[1],$data_b[2],$da); printf("%d%s\n",$data_b[0],$da); printf("%d%d%s\n",$data_b[1],$data_b[2],$da); printf("%s\n",$da); printf("%04d%02d%02d%s\n",$data_b[0],$data_b[1],$data_b[2],$da); printf("%02d%02d%s\n",$data_b[1],$data_b[2],$da); }--------------------------------------------------------- 下記のような内容を追加で出力させることは難しいでしょうか。 1.B.txtを元に下記のように数字だけのデータも追加で出力させたかったです(1行目1986,2行目3,3行目6の場合) 198636 1986 36 19860306 0306 2.A.txtを元にA.txtから下記の内容も追加で出力させたかったです(4行目以降は無視して構いません)。 1行目と2行目 2行目と3行目 3行目と1行目 2行目と1行目 1行目と3行目 3行目と2行目 以上、何卒よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

以下のようにしてください。 ------------------------------------------- $file_a = shift(@ARGV); $file_b = shift(@ARGV); open FHA,$file_a or die("can't open $file_a"); @data_a = (); while($line=<FHA>){ chomp($line); push @data_a,$line } close FHA; open FHB,$file_b or die("can't open $file_b"); @data_b = (); while($line=<FHB>){ chomp($line); push @data_b,$line } close FHB; foreach $da (@data_a){ printf("%s%d%d%d\n",$da,$data_b[0],$data_b[1],$data_b[2]); printf("%s%d\n",$da,$data_b[0]); printf("%s%d%d\n",$da,$data_b[1],$data_b[2]); printf("%s\n",$da); printf("%s%04d%02d%02d\n",$da,$data_b[0],$data_b[1],$data_b[2]); printf("%s%02d%02d\n", $da,$data_b[1],$data_b[2]); printf("%d%d%d%s\n",$data_b[0],$data_b[1],$data_b[2],$da); printf("%d%s\n",$data_b[0],$da); printf("%d%d%s\n",$data_b[1],$data_b[2],$da); printf("%s\n",$da); printf("%04d%02d%02d%s\n",$data_b[0],$data_b[1],$data_b[2],$da); printf("%02d%02d%s\n",$data_b[1],$data_b[2],$da); } # 以下を追加 #1.B.txtの出力 printf("%d%d%d\n",$data_b[0],$data_b[1],$data_b[2]); printf("%d\n",$data_b[0]); printf("%d%d\n",$data_b[1],$data_b[2]); printf("%04d%02d%02d\n",$data_b[0],$data_b[1],$data_b[2]); printf("%02d%02d\n",$data_b[1],$data_b[2]); #2.A.txtの出力 printf("%s%s\n",$data_a[0],$data_a[1]); printf("%s%s\n",$data_a[1],$data_a[2]); printf("%s%s\n",$data_a[2],$data_a[0]); printf("%s%s\n",$data_a[1],$data_a[0]); printf("%s%s\n",$data_a[0],$data_a[2]); printf("%s%s\n",$data_a[2],$data_a[1]); ------------------------------------------- 以下、実行結果です。 kato198636 kato1986 kato36 kato kato19860306 kato0306 198636kato 1986kato 36kato kato 19860306kato 0306kato megumi198636 megumi1986 megumi36 megumi megumi19860306 megumi0306 198636megumi 1986megumi 36megumi megumi 19860306megumi 0306megumi meguchan198636 meguchan1986 meguchan36 meguchan meguchan19860306 meguchan0306 198636meguchan 1986meguchan 36meguchan meguchan 19860306meguchan 0306meguchan 198636 1986 36 19860306 0306 katomegumi megumimeguchan meguchankato megumikato katomeguchan meguchanmegumi

megumi19910715
質問者

お礼

tatsu99さま 返信が大変遅れてしまい申し訳ありませんでした。 風邪を引いちゃいました・・・ 先ほど頂いたプログラムを確認しました。 完璧です! 本当にありがとうございました!!! 感激です。 後ほどベストアンサーの登録をさせて頂きます。 本当に本当にありがとうございます! tatsu99さま、季節の変わり目ですが何卒お体のほうご自愛くださいね! めぐみ

関連するQ&A

  • バイナリファイルをテキストファイルに変換する方法を教えて頂けませんか。

    こんにちは。 バイナリファイルをテキストファイルのように読み込んだり、書き込んだりすることは可能でしょうか。バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教授頂きたいです。 以下は自分なりに考えたプログラムなのですが、すごく文字化けして出力されてしまいます。どこがいけないんでしょうか。 ####プログラム#### #include<stdio.h> int main(){ FILE *fp,*fp2; char str[1024]; //file.txtはバイナリファイルなのでバイナリモードで開く if((fp = fopen("file.txt","rb")) == NULL){ printf("file.txt:open error"); exit(-1); } //out.txtはテキストファイルとして保存したいのでテキストモードで開く if((fp2 = fopen("out.txt","at")) == NULL){ printf("out.txt:open error"); exit(-1); } //一行ずつバイナリファイルをテキストファイルにして保存 while((fgets(str,1024,fp)) != NULL){ printf("%s\n",str); fprintf(fp2,"%s\n",str); } fclose(fp); fclose(fp2); return 0; } ####ここまで#### 以下が出力されたテキストファイル(out.txt)です。 ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI&egrave;&Ccedil; ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI0g 酷い文字化けを起こしてしまっています。 解決方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。

  • Perlによるディレクトリ内の連続的な大量データ処理

    Perlのテキスト処理に関する質問です.やりたいことはあるディレクトリ内に10000個ほどの(1)のようなテキストデータがあります.ここで私は(2)のプログラムを作成しました.しかしながら,このプログラムだと10000個あるテキストデータの一つしか処理できません.この処理内容をディレクトリ全体に適用させる方法はありますでしょうか?File::Find::Ruleなどがネット上にあったので使おうと努力しましたができませんでした.どなたかよろしくお願いします. (1)  2020 01 01 00 109.18970 18.36816 -2.317 -2.459 292.712 0.013 91.276 30.618 292.712 0.013 -2.317 -2.459 998.793 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2020 01 01 00 109.54297 18.39178 -2.702 -2.652 292.653 0.013 90.044 30.676  292.653 0.013 -2.702 -2.652 993.902 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ・ ・ ・ ・ (2) use warnings; open INFILE, '<', '2020-01-01_00.txt' or die "file open error: $!"; while( <INFILE> ){ chomp if( /\n$/ ); $Year = substr($_,0,4); chomp if( /\n$/ ); $Month = substr($_,5,2); chomp if( /\n$/ ); $Day = substr($_,8,2); chomp if( /\n$/ ); $Time = substr($_,11,2); chomp if( /\n$/ ); $Lon = substr($_,16,9); chomp if( /\n$/ ); $Lat = substr($_,29,8); chomp if( /\n$/ ); $Temp = substr($_,57,7); chomp if( /\n$/ ); $Hum = substr($_,76,6); chomp if( /\n$/ ); $Ozone = substr($_,85,6); chomp if( /\n$/ ); $Rad = substr($_,140,5); $data = $Year. "-".$Month."-".$Day." ".$Time." ".$Lon." ".$Lat." ".$Ozone." ".$Rad." ".$Hum." ".$Temp."\n"; open($data, ">", "data.txt") or die("error :$!"); } # ファイルを閉じる close INFILE; exit;  

  • ファイル入力方法

    いつもお世話になります。C言語のファイル入力について教えてください。 入力ファイルinput.txtの内容が以下の時、 ----------- abcdefg ----------- 2 3 5 6 3 8 1 7 ----------- ABCDEFG ----------- (1)最初の3行を無視する (2)4行目からの数値データを配列に格納する (3)数値データは最大100行、2列固定 (4)8行目の-----------以降は無視する 以上の条件でプログラムを作成したいのです。(1)(2)(3)の条件は下記のソースコードに入っていますが、(4)の処理の仕方がわかりません。 申し訳ありませんが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main() { int i,cnt=0,N=0,a[100],b[100]; char s[256]; FILE *fpi; if((fpi=fopen("input.txt","r"))==NULL){ fprintf(stderr,"ファイルを開けません\n"); exit(1); } while(fgets(s,256,fpi) != NULL){ //printf("%s",s); cnt++; if(cnt>3){ sscanf(s,"%d %d",&a[N],&b[N]); N++; } } printf("データ行数:%d\n\n",N); for(i=0;i<N;i++){ printf("%d %d\n",a[i],b[i]); } fclose(fpi); return 0; }

  • 指定の行数目から行を抽出する

    いつもお世話になっております. 環境はWindows XP Pro でActiveperlを使っています. Perlでしたいことは,「指定の行数目から行を抽出する」ことです. 具体的には以下のようにしたいと思っております. data.txt A B C D E F line.txt 2 4 6 output.txt B D F 先ほどある方からサンプルソースを教えてもらったのでそれをベースに作ってみましたが,出力のoutput.txtが空のままです. use strict; use warnings; use feature ':5.10'; use IO::File; open my $file2, '<', 'line.txt' or die "can't open input $!"; chomp(my @subjects = <$file2>); close $file2; open my $newfile, '>>', 'data_out.txt' or die "can't open output $!"; open my $file, '<', 'data.txt' or die "can't open input $!"; while (my $line = <$file>) { chomp $line; foreach my $line (@line) { print $line; if ($. eq $subjects){ say {$newfile} $line; } } } close $file; close $newfile; どこが間違っているのでしょうか.ご指摘ください.よろしくお願いします.

    • ベストアンサー
    • Perl
  • textファイルについて

    あるディレクトリーに test.txt aaa.txt があるのですが、 二つのテキストを開いて もし text.txtの3行目に http://www.goo.ne.jp/ があり aaa.txtの10行目にも http://www.goo.ne.jp/ があるとすれば aaa.txtの10行目を消したいのですが、 そんな事って可能ですか?? 色々考えたのですが、aaa.txtの10行目を消す時に 10行目を空にすると言う指定が出来なくて困ってます。 どうしてもaaa.txtの削除が出来ません。 参考までにスクリプトを載せておきます <?php $file_name = array("aaa.txt", "test.txt"); $list = fopen($file_name[0], "a+"); $delete_list = fopen($file_name[1], "r"); $listfile = file($file_name[0]); $listmax = count($listfile); $listfile = file($file_name[1]); $delete_listmax = count($listfile); if ($delete_listmax > 0){ for ($delete_line = 1; !feof($delete_list); $delete_line++){ $delete_lines = fgets($delete_list); $delete_lines = trim($delete_lines); if ($delete_lines){ if (is_file($file_name[0])){ for ($line = 1; !feof($list); $line++){ $lines = fgets($list); $lines = trim($lines); if ($lines){ if ($delete_lines == $lines){ //ここの部分がわからないです fputs($list, "あああ"); echo "O,K\n"; } } } } } } } fclose($delete_list); fclose($list); echo "\n終了\n"; ?> 詳しい方がいましたら宜しくお願いします

    • ベストアンサー
    • PHP
  • テキストファイルの読み込みについて教えて

    また教えてください test13.txtの中身を1,2,3,4,5,6として、以下をコンパイルスルと、 printf("%d\n",a[0]);のときは 1 と結果がでますが printf("%d\n",a[3]);とすると -858993460などと、わからない数字がでます、どこがおかしのか初心者なのでさっぱりわかりません。 #include <stdio.h> int main(void) { int i; int a[6]; FILE *file; file = fopen("d:\\test\\test13.txt","r"); for(i=0;i<6;i++) fscanf(file,"%d",&a[i]); fclose(file); printf("%d\n",a[3]); return 0; }

  • Perlでのファイル入出力、処理方法

    メモ帳で以下のようなプログラムを書きました。(file_1.plで保存しました) #!/usr/bin/perl $file="data.csv"; $cityfile="name.txt"; $outfile="data_out.csv"; open (IN, $file) or die "$!"; open (FILE, $file) or die "$!"; open (OUT, ">$outfile") or die "$!"; @city = <FILE>; ・ ・ ・ これをCygwinコマンド上で、 perl file_1.pl と入力し、Enterを押すと「No such file or directory at file_1.pl line 9.」と表示されます。 line9はopen (FILE, $file) or die "$!";という文です。 どこが間違えで、どのように修正すればよいのでしょうか。 よろしくお願いします。

  • 出力内容を新しいテキストファイルで保存するには?

    プログラム #include <stdio.h> #include <string.h> main() { char text[100]; char a[20], b[20], c[20], d[20], e[20], f[20]; char fname[20]; int i = 1; FILE *fp; printf("■ファイル名>>"); scanf("%s",fname); fp=fopen(fname,"r"); if((fp = fopen(fname,"r")) == NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } else{ printf("ファイルをオープンしました。\n"); } while( fscanf(fp, "%s", text) != EOF){ sscanf(text, "%[^,], %[^,], %[^,], %[^,], %[^,], %[^\0]", a, b, c ,d, e, f); printf("%d回目\n",i++); printf("全文:%s\n",text); printf("1つ目:%s\n",a); printf("2つ目:%s\n",b); printf("3つ目:%s\n",c); printf("4つ目:%s\n",d); printf("5つ目:%s\n",e); printf("6つ目:%s\n\n",f); } } テキストファイル ABCD,EFGH,IJKL,MNOP,QRST,UVWXWZ abcd,efgh,ijkl,mnop,qrst,uvwxyz あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの,はひふへほ テキストファイルから文字列を読み込み、変換させて出力させた内容を他のテキストファイルに保存するにはどのようにしたらいいのでしょうか?

  • ディレクトリ内のテキストファイルに対する同一処理

    よろしくお願いします。現在Linuxの環境でテキスト処理をしております。 ディレクトリ内にファイル名の異なった以下のような大量ファイルがあります。 a.txt 0,1,2,3,4,5,6,7 1,2,3,4,5,6,7,8 b.txt 2,3,4,5,6,7,8,9 3,4,5,6,7,8,9,10 これらのファイルをカンマでsplitし、左から2番目の数にだけ1を引き,下のディレクトリであるoutに出力させます。出力は以下のようになります。 ./out/a.txt 0,0,2,3,4,5,6,7 1,2,3,4,5,6,7,8 ./out/b.txt 2,2,4,5,6,7,8,9 3,4,5,6,7,8,9,10 そこで以下のようなPerlのプログラムを作成しました。 use strict; use warnings; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); print $dir, "\n"; open(FILE, $dir) or die "$dir: $!"; my @file = <FILE>; foreach $line (@file) { my ($a,$b,$c,$d,$e,$f,$g,$h) = split(/,/, $line);      my $b = $b - 1; close(FILE); } open(NEWFILE, "> ./out/$dir") or die "$dir: $!"; print NEWFILE @file; close(NEWFILE); } closedir(DIR); ですが、出力は完了するのですが、元のファイルから計算がされていません。どこがどう間違えているのかご指摘よろしくお願い申し上げます。

    • ベストアンサー
    • Perl
  • Perlのプログラミングについて

    Perlのプログラミングでつまづきました。 # ファイルから指定文字列を含む行を収集する # 入力ファイルのオープンと読み込み print( "入力ファイル名?" ); $n = <STDIN>; chomp( $n ); open( FIN, "<$n" ) or die "入力ファイルオープンエラー: $!\n"; $n = @a = <FIN>; close( FIN ); print( "$n 行読み込みました\n" ); # 行の収集 print( "検索文字列?" ); $x = <STDIN>; chomp( $x ); $ptn = $x; #指定の文字列 $x = @b = grep( /$ptn/, @a ); print( "$x 行見つかりました\n" ); # 出力ファイルのオープンと書き出し print( "出力ファイル名?" ); $y = <STDIN>; chomp( $y ); open( FOUT, ">$y" ) or die "出力ファイルオープンエラー: $!\n"; print FOUT ( $ptn, "\n" ); print FOUT ( $x, "\n" ); print FOUT ( @b ); close( FOUT ); というプログラムで実行すると C:\My Perl\pl>perl プログラムの実行.pl 入力ファイル名?sample1.txt 168 行読み込みました 検索文字列?k 45 行見つかりました 出力ファイル名?out3-24.txt 続行するには何かキーを押してください . . . となり出力ファイルの中身が表示されません。 どこを間違えているのかご指摘いただけないでしょうか?