人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlで

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

●質問者: いまよ
●カテゴリ:コンピュータ
✍キーワード:Perl txt ファイル プログラム 連続
○ 状態 :終了
└ 回答数 : 3/4件

▽最新の回答へ

1 ● yamaneroom
●27ポイント

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

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


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


2 ● うぃんど
●26ポイント

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

書き換え前 書き換え後
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 $_;
 }
}

3 ● ゆう
●27ポイント

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

#!/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);
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ