• ベストアンサー

perlでのテキスト処理

perlでテキストを読みこんで、csv(エクセル)で表示させるとしますよね? その時に項目A・項目B・項目Cとあったとして表示させる順番を変える事は出来るんですか?? たとえば項目B・項目C・項目Aみたいに…。 今テキストで名簿データを、一部の項目だけ取り込んでエクセルで表示させたいと思っているのですが、 この一部の項目をどう指定したらいいのか分かりません; ソートで出来るんでしょうか…? 初心者だし資料も不足しているので、何かテキスト処理について分かりやすく解説している書籍・サイトなどありましたら、教えて下さい。 文章分かりづらくてすみませんが、お願いします。

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

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

  • ベストアンサー
回答No.3

他の方のレスにもありますが、 一度配列に読み込んでしまえば あとは順番を入れ替えて出力してやるだけとなります。 ただし、 csvといってもデータそのものに,が含まれている場合は、 単純にsplit/,/では片づけられません。 本来はwin32::OLEなど、 モジュールを使って処理するのが楽であり確実ですが・・ (使いこなすには文献等読まなくてはいけません) >@out_data[0]=sprintf("%s,%s,%s",@parts[0],@parts[2],@parts[1]); $parts[]です。。

paraiso1210
質問者

お礼

お礼のお返事がおそくなりました。 みなさんのお陰でなんとかなりそうです! ありがとうございました。

その他の回答 (2)

  • togino
  • ベストアンサー率75% (97/129)
回答No.2

例えば、下記のような内容のファイルがあったとします。 鈴木,24,東京 山田,31,大阪 佐藤,28,京都 Excel は単純にカンマで区切られたものを左から順に表示するだけなので 順番を変えるためには、ファイルの中身を表示させたい 順に修正しなくてはなりません。 その為、上記のファイルの名簿から 「都道府県名」と「年齢」だけをこの順で表示させたい場合 東京,24 大阪,31 京都,28 という CSV ファイルを作ってあげなくてはなりません。  open(IN, "input.csv");  open(OUT, "> output.csv");  while($line = <IN>){    chomp($line); # 最後の改行取り除く    @lines = split(/,/ , $line); # カンマで区切って配列にする    $line_new = "$lines[2],$lines[1]\n"; # 前から3番目の項目と2番目の項目の順に並び替え    print(OUT $line_new);  }  close(IN);  close(OUT); (↑注:インデントの為、先頭に全角のスペースがあります) 要点は ・ split 関数を使って、カンマで区切って配列に入れる。 ・ 配列の順序を変えて出力する。 初心者なので大変かと思いますが、1冊ほど Perl の 入門書を買われて読まれたらいいかと思います。 頑張ってくださいっ

paraiso1210
質問者

お礼

お礼のお返事がおそくなりました。 みなさんのお陰でなんとかなりそうです! あれから入門書を購入しました…。 ありがとうございました。

  • iichiho
  • ベストアンサー率37% (416/1114)
回答No.1

できます。 例えば、 @data[0]=「住所,電話番号,氏名」 となっているデータを @out_data[0]=「住所,氏名,電話番号」 とする場合は、下記のようにします。 @parts=split(/,/,@data[0]);   #@parts[0]=住所が格納されます   #@parts[1]=電話番号が格納されます   #@parts[2]=氏名が格納されます @out_data[0]=sprintf("%s,%s,%s",@parts[0],@parts[2],@parts[1]); 私が使っている書籍はオライリー社のperlの本の日本語訳くらいです。 あとは、他人のperlのソースを見て考えたりです。

paraiso1210
質問者

お礼

お礼のお返事がおそくなりました。 みなさんのお陰でなんとかなりそうです! ありがとうございました。 他の方のソースも参考に頑張ってみます!

関連するQ&A

  • perlで大容量CSVのsort方法について

    perlで大容量CSVのsort方法について perlでcsvファイル100MB超のファイルをソートしたいと思ってますが、以下の方法でメモリーの関係上(と思ってます。)できません。 ソートを行う方法がありますでしょうか? 件数も11万件あるので、エクセルでソートしてからの受け渡しが出来ずに悩んでます。 (ここから) #sortロジック sub sort { use warnings; use feature ':5.10'; open my $ifh, '<', $inport or &error("Can't open $inport"); my @lines = <$ifh>; close $ifh; print @lines, "\n"; #csvファイル何番目? my @sorted = map { $_->[0] } sort { $b->[0] <=> $a->[0]} map { [(split q{,}, $_)[0], $_] } @lines; @lines = @sorted; exit; } (ここまで) いつも貴重なアドバイスをありがとうございます。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • csvファイルのソート

    perlで、csvファイルをある項目でソートした結果を表示したいのですが(つまりエクセルで並び替えをするようなこと)、ハッシュ配列等を使用しないとできないのでしょうか? 項目(列)は10項目くらいあります。

    • ベストアンサー
    • Perl
  • スペース含むテキストをCSVの1セルに貼り付けたい

    次のようなエクセルファイルがあります。 A   B    C   D 1  【文字】 文字 URL これはエクセルで作ったものですが、CSVファイルに貼り付けると A,B,C,Dのセルに分割して貼り付けられてしまいます。 テキストエディタに一回貼り付けてCSVに貼り付けてみたりしたんですが同じです。 この 1  【文字】 文字 URL を  Aのセルに貼り付けるにはどうしたらよいでしょうか? わかる方、よろしくお願いいたします。

  • perlで特定のデータを書き出す方法

    perlは何個かプログラムを作ったことがあるのですが、 本当に単純なものしか作ったことがない初心者です。 CSVを読み込んで、そのCSVを元に、あるURLにアクセスし、 そこで取得した特定のデータを書き出すということを行いたいのですが、 どのようにしたら実現できるのでしょうか。 お手数ですがご教授ください。 ---------------- 【持っているCSVデータ】   A  |   B  |  C    |   1  | テキスト|テキストxxx|   2  | テキスト|テキストyyy|   3  | テキスト|テキストzzz| 【1行づつ以下のようなURLにアクセス】 http://www.abcd/テキストxxx 【表示されると以下のようなXMLが返ってくる】 <result> <version>1</version> <text>タイトル</text> <coordinate> <main_id>14231245234</main_id> <div>テキストテキストテキスト</div> </coordinate> <needs_to_verify>yes</needs_to_verify> </result> ↑ 1行づつCSVを読み込んで、 ここのmain_idを一行づつテキストデータに書き出したい。 ---------------- perl でファイルを読み込んだり書き出したりすることは出来るのですが、 URLにアクセスして、 特定のタグに含まれるもののみを書き出すというやり方がわかりません。。 お手数ですがどうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perlでエクセルからテキストファイル生成

    Perlを使い、エクセル表からデータを読み込みテキストファイルを生成したいと思っています。 Perlについて知識はほとんどありません。 サンプル記述等で教えていただけたら助かります。 下記のようなエクセル表があるとします。 <"PARAMETER.xls">   A    B   C +-------+------+--------+ 1| XXX | 32 | 0000 | +-------+------+--------+ 2| YYY |  8 | 000A | +-------+------+--------+ 3| ZZZ | 16 | 1000 | +-------+------+--------+ 4|    |  8 | 000A | (注)"A"列には記入が無いので無視。 +-------+------+--------+ 5| WWW | 32 | F000 | +-------+------+--------+ エクセル表を読み込み、下記の変換方法に従い テキストファイルを生成したいのです。 ●変換方法(基本構文) --------------------------------- if(DTin = "C") <--"C" 列のデータと比較します。 "A" = DTout("B-1":0); <--"A" 列の変数名に、"B-1"の値を代入します。 <-- 改行します。 --------------------------------- 変換後 生成されたファイルは下記を考えています。 ◆生成ファイル "Source.txt" ---------------------------------- if(DTin = 0000) XXX = DTout(31:0); if(DTin = 000A) YYY = DTout(7:0); if(DTin = 1000) ZZZ = DTout(15:0); if(DTin = F000) WWW = DTout(31:0); ---------------------------------- (注)4行目の"A"列には記入が無いので無視します。 以上、ざっくりとした説明で申し訳ありませんが、 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perl/cgiについて、教えて下さい。

    perl/cgiについて、教えて下さい。 行いたい事ですが、 1:a.html(テキストボックスとsubmitボタンがあるだけです) 2:b.html(テキストボックスとsubmitボタンがあるだけです) 3:c.html(1,2のテキストボックスの内容を表示するだけです。) 4:x.cgi があります。4のcgiにはまだ何も記述していませんが、1,2のテキストボックスで入力した値を c.htmlに表示させたいと考えています。 又、c.htmlで値を変更すると、1,2のテキストボックスの値も連動して変わるようにしたいです。 例)a.htmlのテキストボックスで「13」と入力してsubmitボタン押下。c.htmlに「13」が表示される。 c.htmlで「13」を「22」に変更すると、a.htmlのテキストボックスの値も「22」になるといったイメージです。 どうぞ、宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • Perlのテキストの変換について

    初めて質問します。 Perlを使って下記のようにテキストを変換したいんですけど、やり方を教えてください>< 【変換前】 A 1234 A 2345 B 3456 B 4567 【変換後】 >Af >1234 >As >2345 >Bf >3456 >Bs >4567 というふうに並び変えたいんですけど、なにぶんプログラミング初心者なもので、 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • perl/cgiについて、教えて下さい。

    perl/cgiについて、教えて下さい。 下記のようなことを、行いたいと考えています。 とりあえず、  a.html  b.html  c.html があり、 __________________________________ 1:それぞれ、フォームに、テキストボックスが一つあります。 2:他のフォームに遷移できます。(例:a.htmlからc.hmtlのように) 3:各フォームに「A、B、Cの値を確認」ボタンがあります。 4:3のボタンをクリックすると、各テキストボックスで入力した 値が表示される。 【イメージ】 a.htmlのテキストボックスに、100を入力 b.htmlのテキストボックスに、200を入力 c.htmlのテキストボックスに、300を入力 した場合。 Aで入力された値は100です。 Bで入力された値は200です。 Cで入力された値は300です。 ______________________________________ と表示させる、cgiを作成したいです。 又、その際、hiddenを使用して行う方法(手順)を教えて頂けないでしょうか。 ファイルに書き込むことで、値を保持しておくのではと 考えましたが、a.htmlの値100を書き込み、再度、a.htmlの 値を書き込むと、a.htmlのフォームから送られた値が2つ(1回目、2回目)書き込まれた 状態になるように思います。 今回のように、例えば、ファームの入力値を保持して他の(b.thmlなど)に 遷移し、ボタンをクリックすると、全フォームの値を表示するような場合、 どのような方法が考えられるのでしょうか? どうぞ、宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • Perlでのファイル処理方法について

    プログラミングを始めたばかりです。 Cygwin環境でPerlを行っています。計算プログラムをPerlで書いています。 下に示すように、計算プログラムの中にデータを記入し、そのデータを処理することは出来たのですが、外部のファイルを読みそのデータを処理する方法が分かりません。 # y = ax + bを求める @x=(1,2,3); @y=(1,4,9); for(<stdin>){ for($i=0;$i<$n;$i++){ $A = $A + ($y[$i] * $y[$i]); $B = $B + ($x[$i] * $x[$i]);   ・   ・   ・ $a=・・・ $b=・・・ print("a=$a,b=$b"); open (IN, $file) or die "$!"でcsvファイルに記載されてある数値をCygwin上で実行することは出来ました。 作成したプログラムとcsvファイルをCygwinで入力して、入力したcsvファイルのデータを処理(直線近似して傾きを求めたりなど)したいのですが、どうすればよいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlでの、ファイル読み込みについて

    perlでの、ファイル読み込みについてお尋ねしたいことがあります。 a b c d e f g h i というような内容のテキストファイルがあったとき、この成分を「○行×列」の個別に読み込みたいのですが、 (C言語でいう、「A[0][0]=a A[0」[1]=b A[0][2]=c A[1][0]=d ・・・のように) どのようにしたらよいのでしょうか? perlに関しては全くの初心者なのですが、どうしてもperlを使わないといけない事情があり、 稚拙な質問かとは思いますが、どうぞよろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう