perlで


txtファイルを一行ずつ読み込んで、
カンマ(,)が二個連続で続いたら、その行を削除してもとのファイルに戻すプログラムを書いていただけないでしょうか。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/07/26 14:09:46
  • 終了:2010/08/02 14:10:03

回答(4件)

id:yamaneroom No.1

yamaneroom回答回数1040ベストアンサー獲得回数612010/07/26 15:05:12

ポイント27pt

>その行を削除してもとのファイルに戻す

日本語の意味がわからない。


入力ファイルの中で、カンマ(,)が二個連続で続かない行のみを削除するという意味か?

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492010/07/26 21:58:27

ポイント26pt

次の処理を行うものと理解しました

書き換え前 書き換え後
1,2,3,4
,,,
3,4,5,6
4,5,,7
6,7,8,9
,8,9,10
1,2,3,4
3,4,5,6
6,7,8,9



 

入力と出力でファイルを分けてますので動作確認後は同一ファイル名を使うように改造してください

#!/usr/bin/perl
use strict;
use warnings;
my $f1 = 'f1.txt';
my $f2 = 'f2.txt';
#
open( inFH, "<$f1" ) or die 'read open error';
my @lines = <inFH>;
close( inFH );
#
open( outFH, ">$f2" ) or die 'write open error';
print outFH grep{ !/^,/ && !/,,/ } @lines;
close( outFH );

テキストファイルから読み込んで上書き保存する場合は1行1行読み込みながらにはできません(理論上はできなくはないですが面倒なのでやらないです)ので、上記のように配列に一旦読み込んでしまう方法をよく使いますし、ファイルサイズが巨大で1行1行読み込まなければならないとすれば作業用ファイルに一旦書き出してしまい、最後にオリジナルを削除して、作業用ファイルをリネームなどの手を使います

 

下記2つのコードの処理は同等です

print outFH grep{ !/^,/ && !/,,/ } @lines;
foreach ( @lines ) {
    if ( !/^,/ && !/,,/ ) {
        print outFH $_;
    }
}
id:meeker-bot No.3

ゆう回答回数16ベストアンサー獲得回数62010/07/26 21:41:24

ポイント27pt

カンマ(,)が二個連続で続いた行を削除します。

#!/usr/bin/perl
$exclude = ",,";

#ファイルを読む
open(A,"data.csv");
@file = <A>;
close(A);

#出力ファイルの定義
open(OUT, ">data_out.csv");

foreach $line(@file){
	if(index($line, $exclude) == -1){
		#除外文字が無ければファイルに書く
		print OUT $line;
	}
}

close(OUT);

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 NeoCat 2 1 0 2010-07-27 23:45:32

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません