• 締切済み

excel→txtファイル作成時、セル間にできることがある「”」を指すメタ文字

Perlで書いたプログラムでデータファイルを用いるため、Excel→txt形式(タブ区切り)でファイルを保存し、perlでそのテキストファイルのデータをprintしてみると、セルとセルの間に「”」というような記号が入ってしまうことがあります。 これをsplitで省くことはできますでしょうか?その際に用いるメタ記号も教えていただけないでしょうか?各要素を取り出すためにいい方法があれば教えてください。 (1)元のExcelファイル id 2000 2001 2003 001 A_IN A_IN B_IN 002 B_IN B_IN OUT (2)テキストファイル(タブ区切りで保存) id 2000 2001 2003 001 A_IN A_IN B_IN 002 B_IN B_IN OUT (3)以下のようなperlプログラムでprint表示させると「"」という記号が入ってしまい、要素ごと(例えばA_IN、OUT)にデータ処理を行うことができません。 「プログラム」 #import txt file my $errmsg = "can not open $data\n"; my @data0; open(FID, $data) or die $errmsg; chomp(@data0 = <FID>); close FID; my $number = @data0; for (my $i=1; $i<$number; $i++) { my @a = split(/\r/, $data0$i]); my @b = split(/\t/, $a[0]); print @b, "\n"; ←このprintの結果が以下のようになります。 print $b[0], "\n"; ←そのため、タブによるsplitがうまく print $b[1], "\n";  出来ておらず、これらの値も変 print $b[2], "\n";  なものが出力されてしまいます・・・。 print $b[3], "\n"; } 「結果」 001A_IN"A_IN"B_IN 002B_IN"B_IN"OUT (「”」が入る位置は何回か試したところ、変わることがありました。)

  • kooru
  • お礼率60% (6/10)
  • Perl
  • 回答数1
  • ありがとう数1

みんなの回答

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.1

タブ区切りの前に、下記の要領で取り除けないでしょうか? my @a = split(/\r/, $data0$i]); $a[0] =~ s/\"//g; my @b = split(/\t/, $a[0]);

kooru
質問者

お礼

ありがとうございます!早速連休明けに試してみます。

関連するQ&A

  • excel→txtファイル作成時、セル間に「”」ができるのを防ぐ方法

    Excel→txt形式(タブ区切り)でファイルを保存し、データをみてみると、セルとセルの間に「”」というような記号が入ってしまうことがあります。 これを防ぐ方法、また何が原因で起こっているのか教えていただけないでしょうか? ------------------------- 例えば、 excel に1行目:「001」「A_IN」「B_IN」     2行目:「002」「B_IN」「OUT」 という6つの要素を入れて、それをテキスト形式(タブ区切り)で保存すると、以下のように「”」という記号が入ってしまうときがあります。 「”」が入る位置は何回か試したところ、変わることがありました。 001A_IN"A_IN"B_IN 002B_IN"B_IN"OUT ------------------------- また、元のexcelのデータが入っている部分を、outlookのリッチテキスト形式で書いているメールに貼り付けると、一部分のデータにおいて、セル内で変に改行されていたり、右端でセルに入っていたりしているのが確認できました。 たぶん、Excel上では目には見えないけれど、何かタブのようなものが入ってしまっているではないかと思いましたが、どのように解決すればいいか、また、何が原因だか全くわかりません。 よろしくお願いいたします。

  • Excelで作成したtxtファイルを、Unix上で開くと変な部分に「”」が入ってしまいます・・・

    excel に1行目:「001」「A_IN」「B_IN」     2行目:「002」「B_IN」「OUT」 という6つの要素を入れて、それをテキスト形式(タブ区切り)で保存し、そのファイルをUnix上で表示させると、以下のようにデータの間の変なところに「”」という記号が入ってしまうときがあります。 「”」が入る位置は何回か試したところ、変わることがありました。 001A_IN"A_IN"B_IN 002B_IN"B_IN"OUT これを防ぐために何をしたらよいのか、また何が原因なのか、教えていただけないでしょうか? UnixとWindowの互換性の問題でしょうか?? よろしくお願いいたします。 ------------------------ 実際に行った操作は以下の通りです。 1. Excel→text(タブ区切りで保存) 例* 1行目:「001」「A_IN」「B_IN」 2. そのtextファイルをUnix上のフォルダにコピー 3. プログラム(perlという言語)で、一行ごとに表示させたところ、001A_IN"A_IN"B_IN のよう に「”」が変なところに入ってしまっていました。 3.そこで 2 でUnixのフォルダにコピーしたオリジナルのtextファイルを、Excel上で開いて目で見て確認したところ、何らおかしいところはありませんでした。 しかし、excelのデータが入っている部分を、outlookのリッチテキスト形式で書いているメールに貼り付けると、一部分のデータにおいて、セル内で変に改行されていたり、右端寄せでセルに入っていたりしているのが確認できました。 (Excel、textファイル上では、目には見えないけれど、そのおかしくなっている部分に、3 で確認された「”」という記号が入ってしまっていたようでした。) -------------------------

  • perl初心者です。宜しくお願い致します。

    ファイルの容量が大きく。perlを使用してデータの集計をしています。 "A"がきたらflag1をたてなさい。 "B"がきたらflag2をたてなさい。 "C"がきたらflag3をたてなさい。 これでAとBとCを抜き取ること&AからCまでの時間を取得したのですが、 Bの数のmaxの値だけを抜き取りたいのですが、Bがきたときの数をすべて 出力してしまいます。下記の文だと、Bが4回きたら、1,2,3,4と出力してしまいます。 それで4だけを出力したいのですがどのように書き換えたらようか教えて頂けますでしょうか。 '----------------------------------------------------------------------------- open (IN,"< $ARGV[0].txt") or die; open (OUT,"> $ARGV[0]_out.txt") or die; $flag =0; my $a, $b, $c; $count = 0; ####################################################### while($line =<IN>){ ($time,$data) = split(/\s+/,$line); if($data eq "A") { $flag=1; $a = $time; #print OUT $line; #print OUT "\n"; } elsif($data eq "B"){ $flag=2; $count++; $count == $data; print OUT ("$count\n") } #print OUT ("$count\n"); elsif($data eq "C"){ $flag=0; $count=0; $b = $time; $c = $b - $a; print OUT ("time $c\n") } } -------------------------------------------------------------------------------

  • 文字コードの変換(Shift-JISからUTF8)

    文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを 確認するとShift-JISのままです。 どなたか教えていただけないでしょうか? ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; my $input_file="input.csv"; my $output_file="output.txt"; open (IN, $input_file) or die "$!"; open (OUT, ">$output_file") or die "$!"; while (<IN>){ chomp ($_); my @data=split(/,/,$_); for(my $i=0;$i<@data;$i++){ $data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換 $data[$i]=~s/\s+//g; print OUT $_; } print OUT "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • join と split で文字列を操作する場合

    にんにちは、 うまく解決する方法を思いつかないので、質問させてください。 以下のスクリプトを実行すると、a から z を * で join して、 その後、* で split するかなと思ったら、split は正規表現として とらえるためでしょうか、エラーになります。 #! /usr/bin/perl -w use strict; my $a = '*'; my $b = join $a , ('a'..'z'); print "$b\n"; my @result = split /$a/,$b; print "$_\n" foreach @result; exit(); $a = '\*'; にすると、split したときに、 余計な \ が残ってしまいます。 任意の(書く時点では分からない)いろんな文字列で 連結したり分割したりする場合のスマートな方法が ありましたら、教えていただけませんか? Perl 5.8 です。お願いします。

    • ベストアンサー
    • Perl
  • ファイル作成時

    0~5までのHTMLファイルを作成したいと考えているのですが、下記2パターンでの実現方法をご掲示頂けませんでしょうか --------------------------------------------------------------- 1.下記の関数Aの中から関数Htmlを呼び出し、@list分n$_.htmlファイルを作成するというものなんですが print時、@aaaが(中身が空みたいで)読まれておらず、ファイル出力結果の内容は空行後、ファイル毎に ファイルの数字があるだけの状況です。 どうすれば数字.htmlファイル毎にsub Htmlの内容を表示後、その中に$aを入れる事ができますでしょうか sub A{ @list = (0, 1, 2, 3, 4, 5); foreach $_(@list) { @aaa = &Html($_); open(OUT,">$_.html"); print OUT "@aaa{$_}\n$_"; close(OUT); } } sub Html{my($a)=@_; print <<HTML; <HTML lang=ja > <HEAD> <TITLE></TITLE> <BODY>test$a </BODY></HTML> HTML } --------------------------------------------------------------- 2.sab Aの関数内にsub Htmlの内容自体を持ってくる形で実現する場合について これも同様に@aaaが(中身が空みたいで)読まれておらず、ファイル出力結果の内容は空行後、ファイル毎に ファイルの数字があるだけの状況です。 sub A{ @list = (0, 1, 2, 3, 4, 5); foreach $_(@list) { @aaa = print <<HTML; <HTML lang=ja > <HEAD> <TITLE></TITLE> <BODY>test$_ </BODY></HTML> HTML open(OUT,">$_.html"); print OUT "@aaa{$_}\n$_"; close(OUT); } } どなたか上記2点についてのいずれかでも結構ですので、ご教授願えませんでしょうか。宜しくお願い致します。

    • ベストアンサー
    • Perl
  • HTMLのフォームで画像と文字を同時に指定したテキストファイルとフォルダーに書き出す方法教えてください!

    はじめましてCGI超初心者ですけどわかる方ご指導お願いいたします!僕が作りたいのはHTMLのフォームで画像と文字(フォームから相手が記入した値)を画像は指定したフォルダーにアップして文字は指定したTXTファイルに書き出しするってのを作りたいのですがどうにかみもうみまねで文字は指定したテキストに書き出すことはできたのですがどうも画像がわかりません。どうか教えてください!現時点でできてるスクリプトを書いときます。 #!/usr/bin/perl #フォームからデータを受け取り変数へ入れる read(STDIN, $formin, $ENV{'CONTENT_LENGTH'}); # + 記号を半角スペースに戻す $formin =~ tr/+/ /; #URLエンコードデータをデコード $formin =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; @indata = split (/&/,$formin); #受け取ったデータを&で区切り、配列へ foreach $tmp (@indata) #フォームの要素分(配列分)以下の処理を繰り返す { ($name,$value) = split (/=/,$tmp); # =記号で区切り、名前 と 値 に分ける $forminh{$name} = $value; #区切った名前を付けた連想配列に値を入れる } #既存ファイルを読み込み、配列@aaa に入れる open (IN,"test.txt"); @aaa = <IN>; close (IN); #フォームから受け取ったデータを配列の先頭に追加する #その際に各要素はコンマで区切り、後で使えるようにする unshift (@aaa,"$forminh{'name'}\n"); #新しいデータが追記された配列を test.txt に書き出す open (OUT,">test.txt"); print OUT @aaa; close (OUT); print "Content-type: text/html\n\n"; print <<"HTML"; データの書き込みが完了しました。<BR> お名前 $forminh{'name'}<BR> HTML exit; です!ただし画像はまだまったく理解できていません! もしお分かりの人は教えてくれるとうれしいです! よいご指導まってます!

  • Excelのcsv形式の読み込み

    Excelのcsv形式の読み込み 前回、http://okwave.jp/qa/q6018540.htmlで 質問させていただきましたJurassic_periodです。 お力を貸していただきました方々本当にありがとうございました。 今回ですが同じプログラムでまた壁にぶつかってしまいました。 どうかよろしくお願いいたします。 Excelのcsv形式の「file.csv」のようなデータを読み込んでいます。 「out.csv」のように出力したいのですが 未入力「""」のデータ箇所が多々ある事に気が付きました。 次データを読み込むため出力データがズレてしまい困っています。 「file.csv」 "2010/1/1","C","こんにちは","田中","end", "2009/10/2","B","おはよう","","end", "2007/3/20","E","Good mor ning","佐藤","end", "1988/8/16","","こんばんは","中 村","end", "","A","Hello","木村","end", "2005/9/17","D","おはようご ざいます","斎藤","end", 「out.csv」(このように出力したいです) C,こんにちは,田中,2010/1/1,end, B,おはよう, ,2009/10/2,end, E,Good morning,佐藤,2007/3/20,end, ,こんばんは,中村,1988/8/16,end, A,Hello,木村, ,end, D,おはようございます,斎藤,2005/9/17,end, 解決法として、正規表現を用いて「半角スペース」を入れようとしました。 また、直接「file.csv」の「,"",」を置換で「," ",」にしましたが 基データを操作するのは好ましくないのでプログラムで どうにか処理ができないでしょうか。 「今書いているプログラムです」 #!/usr/local/bin/perl use strict; use Fatal qw/ open /; my $csv_file = "file.csv"; my @csv; &readCsvFile($csv_file); open(OUT,">out.csv"); for(my $i=0; $i<=$#csv; $i++){ $csv[$i][0] =~ s/"//; #行頭の"を削除 $csv[$i][4] =~ s/"//; #行末の"を削除 $csv[$i][0] =~ s// /; #空データを半角スペースに置換 $csv[$i][1] =~ s// /; $csv[$i][3] =~ s// /; print OUT $csv[$i][1],","; print OUT $csv[$i][2],","; print OUT $csv[$i][3],","; print OUT $csv[$i][0],","; print OUT $csv[$i][4],",\n"; } close(OUT); sub readCsvFile { open(IN, $_[0]); my $line = ""; while(<IN>) { chomp; $line .= $_; next if $line !~ /end/; push @csv, [ grep { length } split(/","|",|"/, $line) ]; $line = ""; } close(IN); } どうか、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイルからデータを読み込んで配列に格納するには

    読んでいただいてありがとうございます。 Perlをはじめたばかりなのと プログラミング自体もまだまだですので 困っております。 テキストデータ 例えば apple りんご banana バナナ orange オレンジ などというファイルから読み込んで、 my $data ={ my @english, my @japanese, }; などの、配列の構造体に格納するにはどのようにしたら よいのでしょうか。 最初、本を少し読んだだけの知識で、 use strict; use warnings; my $filename = 'data.txt'; my $data = { my @english, my @japanese }; open(IN,$filename) or die "$filename: $!"; while(my $line=<IN>){ for(my $i=0;$i<N;$i++){ ($data->{@english}[$i],$data->{@japanese}[$i])=split(/ /,$line); print "$data->{@english}[$i]\n"; } } close(IN); } などと書いて、 apple banana orange と表示されるのを期待したのですが、 ダメでした。 参考までに私の誤ったプログラムものせましたが、 全然違っているかもしれませんので、まったく新たに アドバイスしていただいてもかまいません。 これを応用したものを使いたいので ぜひともどなたかお教え いただければと思います。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • TXTファイルに文字を入れ込む事が出来ない

    下記のような方法でファイルを書き込みたいと思っていますが、書き込まれずにいつまで立っても白紙のままです。 どうかご指摘頂けないでしょうか? お願いします。 $in_file = "oyamanew.txt"; if ( !open( IN_FILE, "+<$in_file") ){ print "INファイルのオープンに失敗しました。"; exit; } @record = <IN_FILE>; $record[0] = "$ROWKDATA[3]\n"; seek( IN_FILR, 0, 0 ); print IN_FILR @record; truncate( IN_FILE, tell( IN_FILE ) ); close( IN_FILE );

専門家に質問してみよう