• ベストアンサー

ファイル分割2

前回ファイル分割について質問させていただいた者です。 ファイル名 あいうえお.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つファイルに分割するプログラムをどのように追加するか わかりません。 ほんとにあほみたいなことを聞いているとは思いますが、 教えていただけないでしょうか? よろしくお願いします。

  • Perl
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答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);

hanabi100
質問者

お礼

ありがとうございます。 pl2batコマンドでバッチファイルにし動作させることができました。

その他の回答 (1)

  • leaz024
  • ベストアンサー率75% (398/526)
回答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; ※$. には、今読んでいるファイルから読み込んだ行数(ここではブロック数)が自動でセットされます。 ※全角空白でインデントしているので、コピーした場合はタブなどに置換して下さい。

hanabi100
質問者

お礼

ありがとうございます。 全角をとって動作させたところ 意図した動作になりました。

関連するQ&A

  • CSVファイルをAccessに取りこみたい

    以下のような2つのCSVファイルがあるとします。 【hoge1.csv】 aaa,bbb,ccc,ddd 1,2,3,4 【hoge2.csv】 aaa,bbb,ddd,eee,fff 1,2,4,5,6 Accessをあまり使用したことがないので教えていただきたいのですが、 hoge1.csv、hoge2.csvを、以下のような形で Accessの1つのテーブルにインポートする事はできるのでしょうか? ---------------------------- | aaa | bbb | ccc | ddd | eee | fff | | 1 | 2 | 3 | 4 |  |  | | 1 | 2 |  | 4 | 5 | 6 | ---------------------------- ※「aaa」「bbb」…をフィールド名としたいです vb等でプログラムを自作するしかないのでしょうか? 何か良い方法がありましたら教えてください。お願いします。

  • CSVに外部テキストファイルを列として追加する方法

    こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,title,developer_name,seller_name,primary_genre_name,application_url 000,AAA,BBB,CCC,DDD,EEE 111,AAA,BBB,CCC,DDD,EEE 222,AAA,BBB,CCC,DDD,EEE 333,AAA,BBB,CCC,DDD,EEE

  • C言語による「テキストファイルの読み書き(fprintf)」について

    C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

  • CSVデータをツリー表示させたい

    業務で、WEBサイトにCSVデータを表示させたいと考えています。 CSVデータは、毎日更新されるもので、行数も日々変更されます。 項目の中に「レベル」という項目があり、この「レベル」の値を使って、 ツリー表示出来ないかと考えています。 希望としては、決められたフォルダに決められたファイル名で、 CSVデータを置けば、自動的にWEB上にツリー表示されるという ことです。 J-query等で、これを実現出来るプラグインが無いか探しているのですが、 なかなか希望に合うものが見つからず、困っています。 (CSVをWEB表示するものは見つかるのですが、ツリー表示出来る ものが見つかりません) 何か、良い方法があれば、ご教示頂けませんでしょうか? 例 コード  レベル 品名  規格 ・・・・    コード     レベル 品名  規格 ・・・・  1234    1   AAA   aaa       -1234       1    AAA   aaa 2345    2   BBB   bbb        ∟2345     2    BBB  bbb 3456    3   CCC   ccc          ∟3456   3    CCC  ccc 4567    3   DDD   ddd          ∟4567   3    DDD  ddd 5678    3   EEE   eee           ∟5678   3    EEE  eee 6789    4   FFF   fff             ∟6789  4    FFF   fff 7890    3   GGG  ggg           ∟7890   3    GGG  ggg

  • フリー配布CGIのファイル名変更

    お世話になります。 メールで受信するフォームでを作っていますが、CGIを自分で組めないため配布CGIを利用させていただいてます。フリー配布CGIなのでカスタマイズ可能なのですが、ファイル名を変更しても機能するのか教えてください。 例えば <AAA>フォルダ  │--bbb.cgi  │--fff.pl  │--ccc.html があります。ccc.htmlを動かすためのbbb.cgiです。 もうひとつCGIを入れたいフォームeee.htmlが有る場合、上記のフォルダとファイルをコピーしてファイル名を変更して利用することはできますか? │ │--<AAA>フォルダ │   │--bbb.cgi │   │--fff.pl │   │--ccc.html | │--<DDD>フォルダ     │--bbb2.cgi     │--fff2.pl     │--eee.html ccc.htmlとeee.htmlのフォームの内容は異なるのですが、ファイル名を気軽に変更したcgiファイルでも大丈夫でしょうか? または、<AAA>にeee.htmlを入れてbbb.cgiを共有させることはできるのでしょうか?(<DDD>フォルダ以下はなしで) プログラムファイルを壊してしまうのが怖くてなかなか実行できないでいるのです。 抽象的な質問ですみませんが、よろしくお願いします。

    • ベストアンサー
    • CGI
  • 文字変換で,を改行されないようにしたい

    下記のスクリプトでファイルから読み込んだ行毎の文字列<>を'=>'に変換後、行の先頭に'を付け足し行の最後に',を付け加えた場合、変な風に改行されてしまいます。 $ cat list1.txt 01<>ああああ 01_01<>あAAA 01_02<>あBBB 01_03<>あCCC 01_04<>あDDD 02<>いいいい 02_01<>いAAA 02_02<>いBBB 02_03<>いCCC 02_04<>いDDD open(IN, "<list1.txt"); @datas = <IN>; close(IN); open(OUT, ">date.txt"); foreach (@datas) { ($a, $b) = split(/<>/, $_); print OUT "'$a'=>'$b',"; } close(OUT); 実行結果 $ cat date.txt '01'=>'ああああ ','01_01'=>'あAAA ','01_02'=>'あBBB ','01_03'=>'あCCC ','01_04'=>'あDDD ','02'=>'いいいい ','02_01'=>'いAAA ','02_02'=>'いBBB ','02_03'=>'いCCC ','02_04'=>'いDDD ', これを下記のように整形するにはスクリプトのどこを直せばよいのでしょうか。 '01'=>'ああああ', '01_01'=>'あAAA', '01_02'=>'あBBB', '01_03'=>'あCCC', '01_04'=>'あDDD', '02'=>'いいいい', '02_01'=>'いAAA', '02_02'=>'いBBB', '02_03'=>'いCCC', '02_04'=>'いDDD', どなたかご教授お願い致します。(上記のスクリプト以外の方法で スマートなやり方などありましたらあわせてご教授頂けますと助かります。)

    • ベストアンサー
    • Perl
  • accessvbaで内容を結合して保存

    accessvba初心者です。質問なのですが下記のようなxmlファイルがあるとします。 <?xml version="1.0" encoding="shift_jis"?> <データ> <aaa> <bbb>1</bbb> <ccc>2</ccc> <ddd>3</ddd> <eee>4</eee> <fff>5</fff> </aaa> </データ> これをvbaにて<bbb><ccc><ddd><eee>の内容を取り出し結合して出来た1234をAテーブルのBフィールドにレコード保存したいのですが出来ますでしょうか? テーブルを開いてフィールドに保存する部分はなんとか理解出来たのですが要素を取り出して結合する部分がわかりません。 access2003を使用しています。よろしくお願いします。

  • 外部ファイルからの指定行と指定文字の削除

    perlで、外部のCSVファイル(01_01.csv)を読み込み、「先頭の9行」とその行以降の「先頭9文字」を削除したものを [01_01_out.csv]として保存したいのですがどのようにしたらいいのでしょうか。 ご回答、よろしくお願い致します。 例) 読込ファイル:01_01.csv ---------------------------------------- AAA BBB CCC DDD EEE FFF GGG HHH 00:00:00,1 00:01:00,2 00:02:00,3 00:03:00,4 00:04:00,5 00:05:00,6 (略) 10:00:00,101 10:01:00,102 10:02:00,103 10:03:00,104 10:04:00,105 10:05:00,106 ---------------------------------------- 出力ファイル:01_01_out.csv ---------------------------------------- 1 2 3 4 5 6 (略) 101 102 103 104 105 106 ----------------------------------------

  • EXCELで複数行の検索

    初心者です。 Aファイルのaaa、bbbなどをキーに Bファイルを検索してできるだけ簡単にマクロ等使わずに 下記のような抽出をする方法があれば教えてください。 よろしくお願いします。 Aファイル aaa bbb ccc Bファイル(例えば「ddd」と「あ」は別セルです) ddd あ eee い aaa う fff え bbb お ggg か ccc き 結果 Aファイル aaa う bbb お ccc き

  • テキスト処理のシェルプログラム

    UNIXシェルもしくはPerlでテキスト処理のシェルスクリプト を作成したいのですがご教授お願いします 1000行あるテキストファイルを 2行単位で区切り2行単位で横一列へ置換しテキストへ出力したいのですが 例 処理前 aaa bbb ccc ddd eee fff 処理後 aaa,ccc,eee bbb,ddd,fff ご教授よろしくお願いします