前回ファイル分割について質問させていただいた者です。
ファイル名 あいうえお.txt
内容
<A>AAA
<B>BBB
<C>CCC
<D>DDD
<E>EEE
<F>FFF
というファイルを
ファイル名 あいうえお1.csv
A,B
AAA,BBB
ファイル名 あいうえお2.csv
C,D
CCC,DDD
ファイル名 あいうえお3.csv
E,F
EEE,FFF
という感じで変換させたいと思っております。
A,B,C,D,E,F
AAA,BBB,CCC,DDD,EEE,FFF
に変換するプログラムは
my $mae = my $filename = shift @ARGV;
my $ato = "$filename.csv";
open(IN,"$mae") || die "Can't open!";
my @datas = <IN>;
close (IN);
my (@ichi,@ni);
foreach (@datas){
if ($_ =~ /^<(.*)>(.*)$/){
push(@ichi,$1);
push(@ni,$2);
}
}
my $ichi = join(",",@ichi);
my $ni = join(",",@ni);
open (IN,">$ato") || die "Can't open!";
eval 'flock(IN,2);';
seek (IN,0,0);
print IN ("$ichi\n");
print IN ("$ni\n");
eval 'flock(IN,8);';
close (IN);
exit;
こんな感じで作成したのですが、前回教えていただいた3つファイルに分割するプログラムをどのように追加するか
わかりません。
ほんとにあほみたいなことを聞いているとは思いますが、
教えていただけないでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
こんな感じ?
my $mae = my $filename = shift @ARGV;
my (@ichi,@ni);
$filename =~ s/\.txt$//;#拡張子.txtを取り除く
$"=','; #配列の表示区切りをカンマにする
open(IN,"$mae") || die "Can't open!";
$i=1;
open(OUT,">$filename$i\.csv");
while(<IN>){
if(/^\n$/){ #改行で区切られている
print OUT "@ichi\n@ni\n";
close(OUT);
(@ichi,@ni)=((),());
$i++;
open(OUT,">$filename$i.csv");
} else {
if (/^<(.*)>(.*)$/){
push(@ichi,$1);
push(@ni,$2);
}
}
}
close(OUT);
unlink("$filename$i.csv");#作りすぎのファイルを消す
close(IN);
No.2
- 回答日時:
No.1さんとは別の手法でサンプルを作ってみました。
どのように処理しているのか表示できるようにしてありますので、よかったら試してみて下さい。# 処理内容表示用
my $verbose = 1; # 1:表示、0:非表示
sub lf2n {
(my $tmp = $_[0]) =~ s/\n/\\n/g;
return qq("$tmp");
}
# 空行までを1ブロックとして処理するための設定
$/ = "\n\n";
# ファイル名と拡張子を分けて取得(ファイル名は出力にも使う)
my ($filename, $extension) = split /\./, $ARGV[0], 2;
open IN, "$filename.$extension" or die $!;
# ブロック単位で読み込む
while (<IN>) {
if ($verbose) {
print "block $.\n";
print " read ", lf2n($_), "\n"; # 読み込んだデータ
}
# 出力データ格納用
my @csv;
# ブロック内の各行から、ラベルとデータを取得
while (/\G<(.*)>(.*)\n/g) {
$csv[0] .= "$1,"; # ラベル行
$csv[1] .= "$2,"; # データ行
if ($verbose) {
print " match ", lf2n($&), "\n"; # マッチした部分
print " csv[0]=", lf2n($csv[0]), "\n";
print " csv[1]=", lf2n($csv[1]), "\n";
}
}
# ラベルとデータの行末の , を改行に置換
s/,$/\n/ for @csv;
# ファイルに出力
open OUT, "> $filename$..csv" or die $!;
print OUT @csv;
close OUT;
if ($verbose) {
print " output to '$filename$..csv'\n"; # 出力したファイル名
print " csv[0]=", lf2n($csv[0]), "\n";
print " csv[1]=", lf2n($csv[1]), "\n";
}
}
close IN;
※$. には、今読んでいるファイルから読み込んだ行数(ここではブロック数)が自動でセットされます。
※全角空白でインデントしているので、コピーした場合はタブなどに置換して下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- その他(クラウドサービス・オンラインストレージ) Google ColabでGoogleドライブのサブフォルダにファイルを生成する方法 1 2022/10/31 17:37
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- 英語 horseshoe pitch 1 2022/03/31 02:46
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVデータの編集の際の重複チェ...
-
Perlの初心者です。2重ループ...
-
ファイル分割2
-
ExcelをCSV書き出す場合のシー...
-
ReadLineでの読み出し行を指定する
-
VBAでCSVファイルの特定行を書...
-
awkスクリプトでダブルクォーテ...
-
エクセルVBA コードが同じでも...
-
window.open でのファイル指定方法
-
タブの色を変更する方法
-
サーバーにある特定の拡張子フ...
-
指定したフォルダにアップロード
-
batファイルでrenameができませ...
-
パスから最後のディレクトリだ...
-
Perlの質問:行と列を入れ替え...
-
Perl<->Oracle間での文字化けに...
-
perlでファイル内の文字列を置...
-
close()で例外が投げられる理由
-
Perlについて
-
sprintfについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
Perlの初心者です。2重ループ...
-
perlでcsvファイルを読む(ダブ...
-
Argument "\\\\n" isn't numeri...
-
perlにてスペースの削除に苦労...
-
Perl初心者です。同一データを...
-
ファイルの3行目までを出力したい
-
先頭の単語が一致した時のデー...
-
Java CSVファイルをカンマごと...
-
FTP接続時失敗時、接続先名をcs...
-
データファイルからのデータの...
-
MATLAB std::exceptionエラー
-
cgiのログの書き方
-
エラーチェック、ファイルに特...
-
Perlで空白行を削除
-
perl:パターンマッチを使ったif...
-
CSVファイルのデータの行数を取...
-
外部ファイルからの指定行と指...
-
コマンド上の行間
-
perlでファイルの比較
おすすめ情報