すみません、度々perl初心者のものです。
CSVファイルを1行ずつ読み込んで処理をしたい場合、
1項目内のデータの中に改行がある場合、
どのような方法で対処出来るでしょうか?
例えば
"aaa,bbb,ccc
ddd,eee,fff"
上記のようにcccとdddの間に改行が入ってるため
本当は1レコードのはずなのに2レコードとして
処理を行ってしまう。
perlで何かやり方はあるのでしょうか?
csvを加工するのもよいのですが、データが多量に
あるため、プログラム上でなんとかしたいと思うのですが。。。
すみません、宜しくお願い致します。
No.3ベストアンサー
- 回答日時:
自分でしたら、まず、ダブルクォテーションで囲まれている改行コードを、すべて何かの文字に置換してしまいます。
その後は、普通のCSVと同様に処理をして、最後に置換した文字を改行コードに戻してやります。my $file = 'data.csv';
open IN, '<', $file or die "cannot open $file : $!";
$/ = "";
my $data = <IN>;
close IN;
while($data =~ s/\"(.+)\n(.+)\"/$1<>$2/g){
}
# 後は普通のCSVとして処理(例)
foreach(split /\n/, $data){
my @data = split /,/;
map{ s/<>/\n/g } @data;
print "@data\n";
}
No.4
- 回答日時:
# No.3の訂正
while($data =~ s/\"(.+)\n(.+)\"/$1<>$2/g){
}
じゃなくて
while($data =~ s/\"(.+)\n(.+)\"/"$1<>$2"/g){
}
No.2
- 回答日時:
安易な方法で、必要なパターンを満たしているか自信がないですが、こんな感じでどうでしょう。
----------------------------------------------------------------
use encoding "Shift_JIS";
sub readCSVline($){
my $FH = shift ;
my $line = "";
my $count=0;
while(<$FH>){
$count += tr/\"/\"/;#" の数を数える
$line .= $_; #条件が成立するまで、行を拡張する
if($count % 2 == 0){ #偶数倍になっていたらマッチングしているとして読み込んだ行を返す
return $line;
}
}
}
open(IN, "<data.csv");
while($line = readCSVline(IN)){
#一行の処理
}
close(IN);
No.1
- 回答日時:
がると申します。
ちと面倒な処理にはなるのですが。状態遷移プログラムが書けるのであれば(Perlで十分に記述は可能です)、処理は出来るかと。…いやまぁ状態遷移じゃなくても書けるのですが、状態遷移のほうが楽なので、程度なのですが。
googleあたりで「CSV 状態遷移」とかで調べたりすると色々と情報など出てくるかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlで空白行を削除
-
batファイルでrenameができませ...
-
window.open でのファイル指定方法
-
awkスクリプトでダブルクォーテ...
-
ExcelをCSV書き出す場合のシー...
-
csvファイルの横方向への改行に...
-
perlにて2つのファイル比較
-
動かなくなったのでJavaソース...
-
DOSコマンドで、標準出力を出力...
-
バッチファイルの作り方(CSV→...
-
fgets で値が取得できない
-
Windowsで複数のファイルを同じ...
-
全角と半角文字が混在している...
-
VBAでCSVファイルを途中行まで...
-
perl上からfindを使い検索した...
-
readdir()で得られるファイル・...
-
utf8使用時のフォーム入力文字...
-
タブの色を変更する方法
-
openした後、closeしないでプロ...
-
ファイル出力をUTF8Nではなくて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
perlでcsvファイルを読む(ダブ...
-
CSVデータの編集の際の重複チェ...
-
CSVファイルのデータの行数を取...
-
Perlの初心者です。2重ループ...
-
Perlで空白行を削除
-
CSVファイルをperlプログラムで...
-
MATLAB std::exceptionエラー
-
Perlでの重複要素カウントにつ...
-
cgiのログの書き方
-
Argument "\\\\n" isn't numeri...
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
-
DOSコマンドで、標準出力を出力...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
close()で例外が投げられる理由
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
おすすめ情報