• 締切済み

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); }

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

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

$filename = sprintf("%03d.html",$count); @listinfo = split(/\,/,$list[$count]); $count を使って sprintf で作っているファイル名を、 split の結果から作ればいいだけでは? #!/usr/bin/perl use strict; use warnings; use feature ':5.10'; my @list = <DATA>; foreach my $line (@list) { my @fileds = split q{,}, $line; my $filename = $fields[1]; my $html = $template; for (my $cnt=0; $cnt<@listinfo; $cnt++){ $no = sprintf "<!--%02d-->", $cnt; $html =~ s/$no/$listinfo[${cnt}]/g; } open my $ofh, '>', $filename or next; print $ofh, $html; close $ofh; } __END__ 山ちゃん,yamadaya,山田屋,山田,?http://www.oooxxx.oo? 最上ちゃん,mogami,最上商店,最上,?http://www.oooxxx.oo? 南ちゃん,minami,南喫茶,南,?http://www.oooxxx.oo 書いてて途中でいやになったので動きません。 あと、 flock(FH, LOCK_EX); open(FH,">$filename"); print FH $html; close(FH); flock(FH, LOCK_NB); ファイルロックの手順がめちゃくちゃです。

関連するQ&A

  • csvの内容を配列に入れて個別に変数をつける

    はじめまして、お世話になります。 内容はdata.csvを開いて$a1の値が、ban1の時に、 該当の一行を読み出して、カンマ区切りでわかれている順番に、 $a1 $a2 $a3という変数に代入して他のプログラム内で、利用できればと思いますが、 思うように値が取得できません。 下記、参考サイトなどを見ながら、 動作の部分をかいてみました。 まだ理解が浅く、見当はずれな指示があるかもしれませんが、 ご参照いただき具体的な、 ご指摘をいただければと思います。 よろしくお願いいたします。 my $dataFile = 'data.csv'; open FH,"<$dataFile" or error_msg("データファイルが開けません : $!"); flock(FH, LOCK_EX); while(<FH>){ chomp(); my@dummy = split(/,/,$_); if($a1 == $ban1) { $hoge = $_; last; } chop $hoge; ($a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9,$a10,$a11) = split(/,/); } flock(FH, LOCK_NB); close FH;

  • CSVファイルのデータの行数を取得したい

    こちらではいつもお世話になっています。Perlに関して、初心者ですが教えてください。 CSVファイルについて、データの存在する行数を取得したいと考えています。自分なりに考えたところでは、下記の方法で取得できるのではと思ったのですが・・・・・ open(FH,"data.csv"); @array = <FH>; $count = $#array; close(FH); data.csvは、1行目から順にデータが入っています。 これで、$countに1を足せばCSVデータの行数になるのではないかと考えています。 しかし、実際に動かしてみると、$countには、data.csvにデータがあるのに「-1」(要素なし)が返ってきます。何か間違いがあるのでしょうか。 あるいは、別にCSVデータの行数を取得する方法が他にあれば、教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 新しいログの書き込み

    新しいログを追加で上に書き込む方法はどのようにしたらよいのかアイディアがありません。 ご教授願います。 if($mode eq "html"){ flock(FH, LOCK_EX); open(FH,"${datafile}"); @html = <FH>; close(FH); flock(FH, LOCK_NB); $html = join('',@html); @html = split(/$chtml/ , $html); $html[1] = $data; $html = join($chtml,@html); flock(FH, LOCK_EX); open(FH,">$datafile"); print FH $html; close(FH); flock(FH, LOCK_NB);

  • ファイルの読み書きについて教えてください。

    フォームから投稿されてきた内容を、テキストファイルに書き込むphpを作っているのですが、 flock関数で、誰かが書き込んでいるときに他の人が書き込めないようにファイルをロックしたいと思っています。 以下のソースでLOCK_EXとLOCK_UNは正しく動作するでしょうか。 いまいち不安で困っています。 //ポストされてきた内容が$nameに入ります $name = $_POST['name']; $fh=fopen("test.txt","a+"); flock($fh, LOCK_EX); fwrite($fh,"$name \n"); flock($fh, LOCK_UN); fclose($fh); どなたか詳しい方教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 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
  • Perlを利用してテキストファイルのデータを読み込み・書き出し

    今作成しているのは、WEB上で仕事の情報をメンテナンス出来るシステムです。HTMLとPerlを利用しています。 その際に、データをテキストファイルにタブ区切りで随時書き込んだり、読込んだりする事でその内容をフォーム上に表示させたりしています。動作はしているのですが、問題が出てきました。1行単位で書き出したり読込んだりしているのですが、最近データ数(件数)が増えてきましたので、処理に時間がかかり書き出しの途中で他のページに切り替えると途中までしかデータが書き出されません。いろいろなパソコンでこのシステムを利用するので、スペックの低いマシンでも、ある程度の処理の高速化を図り、なるべくこのような事が起きないようにしたいのですが良い方法はありますでしょうか。通常こういった形でシステムを作成する場合はどのような方法をとるのでしょうか?教えて下さい。掲示板はこのような仕組みで作られていると思いますが、データの数が多い場合はどのようなコードで作成されているのでしょうか? [コード一部] 各データは変数$data[$x]に取り込んでいます。 open(FH,">$filename"); flock(FH,LOCK_EX); for ($x=0;$x<=$count;$x++) { print FH $data[$x],"\n"; } flock(FH,LOCK_UN); close FH;

    • ベストアンサー
    • Perl
  • CSVデータを読み込み、ファイルにカテゴリを分けて書きこむ

    CSVファイル例 01,0101,○○○,○○○□□,010101, 01,0102,○○○,○○○■□,010102, 02,0201,○○○,○○○□□,020101, ・・・・・ というファイルがあったとすると、 1番目の「01」「02」と、分けて別のファイルに保存がしたいです。 書き込み自体は出来るようなのですが、なぜかループが、番号ごとに1回しかされずに、 log/01.cgi 01<>0101<>○○○<>○○○□□<>010101 log/01.cgi 02<>0201<>○○○<>○○○□□<>020101 となってしまい、全ての生成したファイルには1行しか格納されていません。 ちなみに、csvファイルは1万行近くあります。 ソースはこのような感じです。 $log = "△△△.csv"; # ログ名 $lines = file("$log"); foreach ($lines as $l) { $line = explode(",",$l); $push_line = $line[0]."<>".$line[1]."<>".$line[2]."<>".$line[3]."<>".$line[4]."<>\n"; $LOG[$line[0]] .= $push_line; $cate = $line[0].",,".$line[1]; # サブカテゴリ用 $LOG[$cate] .= $push_line; # カテゴリ用ログを保存 } なお、csvファイルは、 01・・・ 02・・・ 01・・・ 03・・・ のようになっているため、全ての行を読み込むことはしていると思います。 しかし、ログファイルにはなぜか1行分しか書き込まれていません。書き込みの文は以下になります。 foreach($LOG as $key => $value){ $explode = explode(",,",$key); if($explode[0]){ $logfile = "./log/".urlencode($explode[0]).".cgi"; } $file = fopen("$logfile", 'w'); flock($file,LOCK_EX); fwrite($file, $value); flock($file,LOCK_UN); fclose($file); 解決法が分かる方、回答のほどよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ローカルでは動くのにサーバーにアップするとエラーがでる

    最近PHPを勉強を始めました。 とりあえず、参考書の通りに作っていくことから始めています。 アクセスカウンタを設置したく、参考書の通りに記述しました。 <?php $cnt_file = "count.dat"; $cnt_len = 10000; if (file_exists($cnt_file)) { $file = fopen($cnt_file, "r+"); $count = fgets($file, $cnt_len); $count = $count + 1; } else { $file = fopen($cnt_file, "w"); $count = 1; } rewind($file); flock($file, LOCK_EX); fputs($file, $count, $cnt_len); flock($file, LOCK_UN); fclose($file); echo $count; ?> という感じです。 ローカルでは動くのですが、サーバーにアップするとエラーがでて困っています。 ローカルではXAMPPをインストールしていてPHP5なようです。 サーバーはPHP4.4らしいですが、調べても対応している命令をだしているようなのですが、何故かエラーがでています。 問題を解決したいのですが、何分初心者で行き詰まっている状況です。 わかるかたよろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVファイルを読み込み、ファイル名を変更。

    CSVファイルを読み込み、ファイル名を変更。 使用言語はperlです。perlは初心者です。 アルゴリズムが、 CSVファイルを読み込み→2次元配列に格納→ファイル名変更 という流れになっているプログラムを作成中です。 CSVファイルの中身は あ.txt , a.txt い.txt , b.txt う.txt , c.txt です。 CSVファイルを読み込み2次元配列に格納するプログラムは以下のようにしました。 ----------------------------------- $i= 0; open IN, "sample.csv"; while (<IN>) { my @data = (); @data = split (/,/); for (0..@data) {$jdata[$i][$_] = "$data[$_]";} $i++; } close IN; ---------------------------------------- 「あ.txt」を「a.txt」に変更しようとして、この中に rename $jdata[0][0] , $jdata[0][1] ; と書いてみましたが、変換されません。 どう書けばよいのでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • CSVファイルの上書き

    CSVファイルを$line[0] = $nowの時、上書きするということをしたいのですが、array_spliceでうまくいきません。 アドバイスお願いします。 $fp = fopen('log/order.csv', 'a+'); flock($fp,LOCK_EX); if ($fp) { require_once( "./common.php" ); $AddressData = LoadTextFile( "./log/order.csv", "SJIS", "SJIS" ); if ( $AddressData == false ) { exit; } else { for ( $i = 0; $i < sizeof( $AddressData ); $i++ ) { $line = explode( ",", $AddressData[ $i ] ); if($line[0] = $now){ array_splice($line, 1, 3, array("1","2","3")); #fputs($fp, $buf2); flock($fp,LOCK_UN); fclose($fp); } } } }

    • 締切済み
    • PHP

専門家に質問してみよう