• 締切済み

CSVデータ修正時のファイルへの書き込み不具合?

こんにちは。 初心者ながら、PerlでCSVファイルを使って簡易的なDBを作っています その際、下記の方法でCSVファイルの修正していますが、うまくいきません>< 申し訳ありませんが、お知恵をお借りできますでしょうか? 困っております(泣) ◆下記プログラム内容  CSVを読み込み、一致する部分があればそこを修正し、新たなCSVとして書き出す ◆マスターDB(カンマ区切りのCSVファイルにて作成)  ・DBは横230×縦max2000程度(現行は横200×縦100程度)  ・先頭、横20までは日本語で、最大でも全角50文字程度(改行、カンマは事前に除外(置き換え)しています)  ・その後は「1 or 空白」。(フラグが立っているか、いないかだけ) ◆発生する不具合?  (1)修正箇所の後ろの2~3行が、修正行の後ろにそのまま追加される(欠落する場合もあり)  (2)DBの一番最後の最後の行に不明なデータが追加される   例1:,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1,,,,,,,,1   例2:,,,,   例3:改行のみ  (3)上記、(1),(2)は基本的に同時発生  (4)上記、(1),(2)が毎回ではなく時々発生(と言うか、かなり頻繁に… 10回に8回程…) *************************************** # @master:CSVデータを読み込んだDB # @data:修正内容の入っている配列 # @write_db:修正後の@master(これが新しいCSVとして書き込まれる) #読み込み、及び修正 open (write_db,"+<db.csv"); flock write_db,2; $i=0; while(<write_db>){ @master = split(/,/, $_); if( $master[0] == $data[0] ) { $master[1] = $FORM{'textfield62'}; $master[2] = $FORM{'textfield6'}; $master[9] = $data[3]; $master[10] = $data[4]; $master[11] = $data[5]; $master[12] = $data[6]; $master[13] = $data[7]; $master[14] = $FORM{'textfield7'}; $master[15] = $FORM{'textfield5'}; #修正前の”1”のフラグ情報をクリア for( $m = 21 ; $m <= $#master ; $m++ ){ $master[$m]=""; } #修正情報の入っている@dataに基づいて@masterを変更(新しいフラグを立てる) for( $k = 8 ; $k < $end_num ; $k++ ){ $master[$data[$k]] = 1; } } $write_data[$i] = join(',',@master); $i++; } seek write_db,0,0; close (write_db); #書き出し操作 open (OUT,"+<db.csv"); flock OUT,2; foreach my $ii ( @write_data ){ print OUT $write_data[$ii]; } seek OUT,0,0; close (OUT);

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

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

少なくとも 書き出し操作の > foreach my $ii ( @write_data ){ > print OUT $write_data[$ii]; > } の print は、 print OUT $ii; の間違いですね。 その他、元の CSV にある改行コードは、書き換えでなくなって いるかも。

miso99miso
質問者

お礼

ご返答ありがとうございます! >元の CSV にある改行コードは、書き換えでなくなっているかも この点、修正させて頂き、不具合の(1)が解決いたしました! (配列の最後の値にjoinで"\n"を付与致しました) また、不具合の(2)~(4)については 最後の書き込み操作を下記の通り修正した所、解決致しました。 (seekをprintの前に持ってきて、その前にtruncateを付けました) open (OUT,"+<db.csv"); flock OUT,2; truncate(OUT, 0); seek OUT,0,0; foreach my $ii ( @write_data ){ print OUT $ii; } close (OUT); まだまだPerl初心者ですが、t-okura様の助言もあり、少しづつ前に進んでおります!(と、思っておりますがw) また不明な点あれば、ご相談させて頂く事あるかと思いますが、 何卒よろしくお願い致します。 本当にありがとう御座いました。

関連するQ&A

  • どうやればいいのかわかりません><;

    あるプログラムを完成させたいんですが、 以下の部分がうまくいきません。 foreach $del_word ( @del){ if ( "$FORM{'sub_product'}" =~ /$del_word/){ open(IN, ">>./csv/log.csv") or printErrorPage("エラー"); eval{ flock (FILE, 2) }; seek(IN, 0, 2); print IN "$in"; close(IN); { exit; } } } 簡単に説明しますと、 @delは1行に1単語(例えば「時計」など)ずつ約10行ほど入力したdel.csvファイルの内容が入っています。 ちなみにそこの部分は open(OUT, "./csv/del.dat") or printErrorPage("エラー"); eval{ flock (OUT, 1) }; @del = <OUT>; close OUT; です。 そして、どういった作業をしたいかというと、 この$FORM{'sub_product'}に入っているワードに@delに収納されているワードがひとつでもマッチする場合、 $inという文章をlog.csvに書き込むというプログラムです;; 初心者なのですが、どなたかアドバイスいただけたらと思います!!どうぞ宜しくお願いしますーっm(_)m

    • ベストアンサー
    • CGI
  • Windows bat でCSVデータを処理したい

    <CSVデータの内容> 0004 10,11,19,12,15,1192,0,00 10,11,20,17,30,1192,1,00 10,11,21,01,00,1193,0,00 10,11,22,20,00,1193,1,00 (1)CSVデータの行ごとに、7番目と8番目の値が0,00の場合、10,11,19を取得して値をDBにインサートしたい。 (2)CSVデータの行ごとに、7番目と8番目の値が1,00の場合、10,11,20を取得して値をDBにインサートしたい。 このような処理をするには、どうしたら、良いでしょうか?

  • ファイルへの書き込み

    フォームに入力されたデータをCSVファイルに書き込みたいのですが、以下のようにすると追加で書き込みはできるのですが、ずっと改行されずに1行に書き込まれてしまうので、新しいデータを入れる際に改行されるようにしたいのですが、どのようにすればいいでしょうか? $fp = fopen(TEST_FILE,"a") or die("ファイルを開けません\n"); flock($fp, LOCK_EX); fputs($fp, "aaa")."\n"; flock($fp, LOCK_UN); fclose($fp);

    • ベストアンサー
    • PHP
  • csvファイルのデータを変数として取込むには?

    javascriptは1年生です^^ データバインドを利用して、テーブルにデータを表示しています。 document.write("<object id='setData' classid='clsid:333C7BC4-460F-11D0-BC04-0080C7055A83'>"); document.write("<param name='DataURL' value='setdata.csv'>"); document.write("<param name='UseHeader' value='true'>"); document.write("</object>"); document.write("<table border='1' datasrc='#setData'>"); document.write("<tr>"); document.write("<td><span datafld='data1'></span></td>"); とこんな感じで続くのですが、csvファイルのデータには、セル幅や背景色等の設定値も含まれています。 これらのデータは表示用のデータではないので、変数として取込まなければなりません。 普通なら、bodyタグの中に、 <input type="hiden" datafld="optionData1"> と書いて、そこからjavascriptで取込むことは可能ですが、document.writeを使うとbodyタグの中が書き換わってしまうので使えません。 (csvファイルの1行分のデータを、HTMLのテーブルで表示する時には、4行~6行と行数が変動するので、予めテーブルをbodyタグの中に書いておくことが出来ません。テーブル行数はスクリプト内で決定するので。なのでbodyタグの中は空でオールjavascriptでHTMLを生成しています) もう一つの方法はフレームを使って、parentで、データを送ることも考えたのですが、もっとスマートな方法はないでしょうか??

  • CSVデータの区切りが「","」の読み取り方法

    CSVデータの区切りが「","」で区切られてます。 (ここから) "山田","埼玉県","男性" "田中","埼玉県","男性" "井上","栃木県","女性" "志村","千葉県","男性" (ここまで) 以下のような区切りで行うと思ってます。 (ここから) open(DB,"<$bunfile") || &error("Can't write $bunfile"); flock(DB, 1); @lines = <DB>; foreach $lines (@lines) { ($name,$addr,$seib) = split("\",\"", $lines); 省略; } (ここまで) この場合、先頭と最後の「"」が残ってしまいます。 どのような方法で削除出来るのかがわからず悩んでます。 「s/\"//g」を使用しようかとも思ったのですが、違う方法がないかと思い質問いたしました。 ご教授いただけますと幸いです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • CSVファイルへの書き込み:文字化けしてしまいます

    こんにちわ。 HTMLファイルから送られてきた3つのデータ(toi,kotae,yomi)を サーバ上のCSVファイルに書き込むプログラムを作りましたが、文字化けしてしまいます。 尚、同じプログラムをPC内のXAMPP環境で動かしていた際は、文字化けは起こりませんでした。 開発は「メモ帳」で行っています。 よろしくお願いいたします。 ***** ↓クライアント側のHTML <html> <head> <title>send data</title> </head> <body> <form name = "myform" action = "data_to_csv.php"> 問い: <input type = "text" name = "toi" value = ""><br> 答え: <input type = "text" name = "kotae" value = ""><br> 読み: <input type = "text" name = "yomi" value = ""><br> <p> <input name= "mybutton" type="submit" value="click" > </form> </body> </html> ***** ↓サーバー側のプログラム <html> <head> <title>the item added to the csv file</title> </head> <body> The items were sucessfully added to the CSV file.<br> <?php $toi = $_REQUEST['toi']; $kotae = $_REQUEST['kotae']; $yomi = $_REQUEST['yomi']; $lines=array($toi, $kotae, $yomi); $lines=implode(",", $lines); $lines=$lines."\n"; //write to a csv file $fp=fopen("data.csv", "a"); // flock($fp, LOCK_EX); fputs($fp, $lines); fclose($fp); ?> </body> </html>

    • 締切済み
    • PHP
  • 「CSVデータ」の変換ツールはありますか。

    会社の「販売管理システム」(DB=SQL)へ、得意先からのCSV 形式の発注データを取り込みたいのですが、取り込められる データレイアウトが当社のものと違うため、不可能です。 CSVデータのデータレイアウトを、こちらが希望するデータレイ アウトへ簡単に変換できるソフトウェアを捜しています。

  • csvファイルを読み込み→上書きするスクリプト【添削願】

    csvファイルを読み込み→上書きするスクリプトを作ってみましたがうまく行かないときがあり原因を考えています。 100行程度のcsvから任意の行($idで指定したもの)を書き換えたいのですが、(テスト書き込みを)書き込んでくれるときと指定したその行だけ削除されてしまうときとまちまちです。 なぜ2パターンの結果がでるのでしょうか? お力をお借りできると幸いです。 <?php //データの取り出し $id = $_GET['id']; $data = file("data/file.csv"); //idで指定した行に書き込み $data[$id] ="テスト書き込み"; //csvファイルにデータの書き込み $file = fopen("data/file.csv","w+"); flock($file, LOCK_EX); for($i=0; $i<count($data); $i++) { fwrite($file,$data[$i]); } fclose($file); ?>

    • ベストアンサー
    • PHP
  • CSVファイル読込みについて

    CSVファイル読込みで困っています。 どなたかご教授をお願い致します。 CSVファイル読込みを行うと、複数行のデータにも関わらず、ネットで調べたプログラムを用いると、1行で読込まれてしまいました。 その原因として、NL(LF)で改行されていたためです。 これをどうにか複数行で読込みを行うための方法はありませんか? NLがある場合、それをvbCrLfに変換してやればよいとは思ったのですが、うまくプログラムを組むことができません。 プログラムをどう組めばよいのか教えて頂けないでしょうか? 以下のサイトを利用させて頂き、読込みを行おうとしました。 http://www.k1simplify.com/vba/tipsleaf/leaf291.html VB初心者なので、どなたかご教授頂けると助かります。 よろしくお願い致します。

  • CSVデータの項目名からファイル名を付ける

    CSVデータからHTML拡張子で書きだすCGIを作成してます。 参考になるサブルーチンをネットで見つけたのですが、行の上から順に001.html・・・・のファイル名になり、CSVデータの項目にあるデータでファイル名を付けたいと思いますが、どのように処理したらよいかわかりません。アドバイス願います。 -------------------------------------------------------------- サンプルのCSVデータ(2行目のファイル名をファイル名につけたいです。) タイトル,ファイル名,会社名,担当者,URL 山ちゃん,yamadaya,山田屋,山田,http://www.oooxxx.oo 最上ちゃん,mogami,最上商店,最上,http://www.oooxxx.oo 南ちゃん,minami,南喫茶,南,http://www.oooxxx.oo -------------------------------------------------------------- コード: $list = join('',@csv); @list = split(/\n/, $list); for($count=1;$count<@list;$count++){ $html = $template; $filename = sprintf("%03d.html",$count); @listinfo = split(/\,/,$list[$count]); for($cnt=0;$cnt<@listinfo;$cnt++){ $no = sprintf("<!--%02d-->",$cnt); $html =~ s/$no/$listinfo[${cnt}]/g; } flock(FH, LOCK_EX); open(FH,">$filename"); print FH $html; close(FH); flock(FH, LOCK_NB); }

専門家に質問してみよう