• ベストアンサー

csvファイルの不定長フィールドの値を取得する方法

いつもお世話になります。 tst.csv aaa,bbbb,ccc dd,eeeeeee,ffff,gg,hh iii,jj ・・・・・ などのように レコードごとにフィールド数の異なるcsvファイルの 各レコードの値を取得したいのですが、できなくて試行錯誤しています。 フィールドの数が同じならば 例えば、フィールド数が2ならば $array = file("tst.csv"); $c = count($array); $i=0; while($i < $c){ $RowData=$array[$i]; list($fiel1,$fiel2) = split("\,",$RowData); print('$fiel1='.$fiel1.' $fiel2'.$fiel2."<br>"); $i++; } とすればできます。 ところが、フィールド数がいくつあるかわからないので、 list($fiel1,$fiel2) = split("\,",$RowData); を list($fiel) = split("\,",$RowData); としてforeachで値を取り出そうとしましたが、 foreach ($fiel as $Value) { echo $value.'<br>'; } Invalid argument supplied for foreach() というエラーが表示され できません。 何が、Invalid argumentなのか見当がつきません。 各レコードの値を $fiel[1] $fiel[2] $fiel[3] などに格納することはできないものでしょうか。 おわかりになる方なにとぞよろしくお願いします。

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

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.3

PHPでは、変数名は大文字、小文字を区別します。 foreachで、$valueと$Valueとなってますが、これは別の変数です。

rqg2010
質問者

お礼

masa6272さん、どうもお手数をおかけしました。 大文字小文字の誤り。その通りでした。 どうも、すみません。 そして、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

splitは、分解した文字列を配列として返します。 list($fiel) = split("\,",$RowData); を $fiel = split("\,",$RowData); にしてください。 動くはずです。

rqg2010
質問者

お礼

masa6272さん、お早ようございます。 返事遅くなり申し訳ありません。 試してみました。 $array = file($csv); $c = count($array); $i=0; while($i < $c){ $RowData=$array[$i]; //list($fiel1,$fiel2) = split("\,",$RowData); $fiel = split("\,",$RowData); foreach ($fiel as $Value) { echo '$i='.$i.$value.'<br>'; } ++$i; } $i=0 $i=0 $i=0 $i=1 $i=1 $i=1 $i=1 $i=1 $i=2 $i=2 となり、フィールドの数だけループされていることは確認できましたが 値が表示されません。 foreach ($fiel[] as $Value) { とすると、Fatal error: Cannot use [] for reading in foreach ($fiel[$i] as $Value) { とすると、 Warning: Invalid argument supplied for foreach() in ・・・ と、なってしまいます。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

微妙にずれているかもしれませんがこんなかんじでしょうか? <? $fname="test.csv"; $handle = fopen($fname, "r"); while (($row = fgetcsv($handle,1024, ",")) !== FALSE) { $fiel[]=$row; } fclose($handle); print "<pre>"; print_r($fiel); print "</pre>"; ?>

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPのデータをCSVファイルに保存

    PHPで入力された情報を、CSVファイルに保存したいのですがうまくいきません。 $list=array($name,$jyusyo,$mail,$tel,$text); $fp=fopen('dat/dat.csv','a+'); foreach($list as $line){ fputcsv($fp,split(',',$line)); } fclose($fp); ウェブで調べてこのような形のものを作成してはみたんですが、 エラーが出てしまいます。CSVファイルに保存したい時は、 CSVファイルを先に作るべきなのでしょうか?そうでしたら、 作成の仕方を教えていただきたいです。 初心者ですがよろしくお願いします。

    • 締切済み
    • PHP
  • foreachで次の行の値を取得して処理したい

    CSVテキストでforeachによる次の行の値を取得し、計算し表示したいのですがわかりません。 どなたか処理の仕方をアドバイスを下さい。 ・csvの内容 2012,20,山田,奈良(1行目) 2012,15,川上,東京(2行目) 2013,10,山本,北海道(3行目) ・処理 $lines = @file($logfile); foreach ($lines as $value){ list($value01,$value02,$value03,$value04)= explode(",", trim($value)); echo "表示: $value01 $value02 $value03 $value04";   *ここで処理:この行の$value02と次の行の$value02を比較計算した値を表示 }

    • ベストアンサー
    • PHP
  • Excelでcsvのフィールドが減る

    csvファイルをExcel2000のテキストファイルウィザードで開き、 再びcsvで保存した場合に、フィールド数(カンマの数)が減る という現象が起こりました。 再保存する際、空白セルが無視されるのかと考えましたが、 同ファイル内に、空白であってもフィールドが保存されている レコードもあります。 OSはWin2000 csvはテキストファイルウィザードで開けない為、 拡張子を一旦 txt に変えてから開いています。 原因、解決方法、何かヒントになりそうな事なら何でもよいので アドバイスよろしくお願いします。

  • PHPでcsvファイルを一覧表示するにはどうすれば良いのでしょうか?

    <?php //ファイルを開く $fp = fopen('maillog.csv', 'r') or die('ファイルが開けません'); //テーブルを出力 echo '<table border="1">'; while ($field_array = fgetcsv($fp, 10000, ',', '"')) { echo '<tr>'; foreach ($field_array as $value) { echo '<td>'.htmlspecialchars($value, ENT_QUOTES).'</td>'; } echo '</tr>'; } echo '<table>'; //ファイルを閉じる fclose($fp); ?> プログラムだと、全ての項目が表示されてしまうので 少ない項目(3~4つ)で表示できるにはどうすれば良いのでしょうか? また、各項目毎のタイトルも付けたいのですが お願いします。

    • 締切済み
    • PHP
  • PHP 検索 システム with CSV file 

    いつもお世話になっています。 早速ですが、 現在、データベース(DB)を使用しないで、PHPとCSVファイルで簡易データベースを作成しています。 (DBは、それだけでも使い方を覚える必要があり、簡易的に作るにはCSVが良いと考えました。) 一通り、CSVファイルの読み込み、保存をするプログラムを完成させました。 (参考 http://ponk.jp/php_file/index.php?page=5) が、ここで検索機能をつけたいと思い、いろいろ調べていました。 しかし、DBを用いる方法は見つかりますが、なかなかCSVファイルを用いた検索方法がみつかりません。 現在想定しているのは、CSVファイルからデータ(table)を読み込み、その中から検索ワードにヒットするデータ(Column)を見つけるといった感じです。 簡易的には、 <?php $list = array('a','b','c','d','e','f'); $search = "d"; foreach ($list as $value){ if ($search == $value) {print "発見!";} } ?> という感じで作れましたが、今想定しているのは、 <?php $list = array('abcd','1234','xyz','日本'); $search = "y"; foreach ($list as $value){ : : (検索方法) : print "xyz を 発見!"; } ?> という感じです。 なにやら、DBを用いる場合では直接検索できる方法があるみたいですが、DBを用いると今後プログラム引渡しを行う際に、PHP以外にもやることが増えてしまうため、また、規模も小さいため、CSVファイルで済ませることができないかと考えています。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVファイル読み込みでズレがおきる

    お世話になります。 Windows XP SP3、Access2003 で CSVファイルをインポートする処理をつくっています。 読み込むCSVファイルが大きく、必要ないフィールドが多いのですが、 下記のようにLine Input で全部読み込んで Splitでカンマ区切りでバラしてvarData(Variant型)にいれて レコードセット(インポート先の既存テーブル)に入れる時に、 必要に応じてデータ型を変更して フィールド指定ししていれるようにしています。 ところが、CSVファイルの中のデータで数件ほど ちゃんと読み込めないものがあり、 レコードセットにいれるときにエラーでとまってしまいます。 調べてみると、フィールドで取得した値がずれており、 前の方の複数のフィールドでNull値があった場合?に ずれ込むことがあるようです。 どうしたらこの現象はなおせるのか教えてください。 それとも・・・ このようにフィールド指定してレコードセットに入れ込むよりも 一度CSVファイルの全レコードを他のテーブルにインポートして、 そこからインポート先の既存の本テーブルにいれたほうがいいのでしょうか? よろしくお願いいたします。 Open ---- For Input As---- Line Input #lngFileNum, strData インポート先のテーブルをレコードセットで開く DAO、トランザクション使用 Do Until EOF(lngFileNum) Line Input #lngFileNum, strData 'データを配列へ varData = Split(strData, ",") With rs .AddNew !番号 = CLng(varData(0)) !名称 = varData(1) !受付日 = DateValue(varData(8)) !種別 = varData(10), "" !登録番号 = CLng(varData(11))           (以下略)

  • CSVデータのn番目だけの値を取得したい

    次のCsvファイルがあります。この2番目の列の値(つまり20,35,58・・・)だけを取得(1次元配列に入れる)したいのです。 ,cosmos,himawari 710,20,106 725,35,131 805,58,175 820,97,180 903,110,180 次のようにしましたが、2番目の値だけの抽出が出来ません。どのように直せば良いでしょうか? <?php $TextData = file("./cosmos.csv"); for($i=0; $i<10; $i++){ $cosmos = $TextData[i][cosmos]; } return $cosmos print_r($cosmos); ?> 出力結果 Array ( [0] => ,cosmos,himawari [1] => 710,20,106 [2] => 725,35,131 [3] => 805,58,175 [4] => 820,97,180 [5] => 903,110,180 )

    • ベストアンサー
    • PHP
  • htmlで作成したフォームにcsvファイルのデータを表示するには

    <?php //ファイルを開く $fp = fopen('maillog.csv', 'r') or die('ファイルが開けません'); //テーブルを出力 echo '<table border="0">'; echo '<tbody>'; while ($field_array = fgetcsv($fp, 4096, ',', '"')) { echo '<tr>'; foreach ($field_array as $key=>$value) { if(!in_array($key,Array(0,1,2,3,4,5,6,7))) continue; echo '<td nowrap>'.htmlspecialchars($value, ENT_QUOTES).'</td>'; } echo '</tr>'; } echo '</tbody>'; echo '</table>'; //ファイルを閉じる fclose($fp); ?> 簡単な一覧は、できるのですが 下記、フォームに対してデータの一覧を表示するには どうすれば良いのでしょうか? 教えてください

    • 締切済み
    • PHP
  • 動的CSVファイルから値なしを削除したい

    jqueryについて質問です。とある動的csvファイルからある特定の列を取り出し、grepを使って値のないものを取り除きたいと思っています。しかしunderfindとなってしまいます。どこを修正すればいいのでしょうか? ちなみにgrepのところを削除すると、「90 247 312 149 360 NaN 110 yMin=90, yMax=360 」という値が返ってきます。 希望は「90 247 312 149 360 110 yMin=90, yMax=360 」という値が返ってきて、最終的には最終行から3つの値、「149 360 110」を取り出したいと考えております。 このcsvファイルは動的で、行数は変化します。 function loadcsv2(url) { if (window.ActiveXObject) { var httpObj = new ActiveXObject("Microsoft.XMLHTTP"); if (httpObj) { httpObj.open("GET","sample2.csv", false); httpObj.send(); } } else if (window.XMLHttpRequest) { httpObj = new XMLHttpRequest(); httpObj.open("GET", "sample2.csv", false); httpObj.send(null); } var rows = httpObj.responseText.split("\r\n"); var dates = new Array(); var items = new Array(); items[0] = new Array(); var result = ""; var n; for (n = 1; n < rows.length; n++) { var fields = rows[n].split(","); if (fields.length < 3) break;//3列目まで dates[n] = fields[0]; items[0][n] = n==0 ? fields[1] : parseInt(fields[1]); var datax = items[0][n] datax = $.grep(datax,function(e){ return e;}); result += datax + "\n" ; } } ===【sample.csv】=== day,sizeA,sizeB 11-19,90,254 11-20,247,261 11-21,312,258 11-24,149,250 11-25,360,215 11-26,,450 11-27,110,196

  • 配列の値を集めた1つの文字列として取得するには

    Array ( [0] => a [1] => あ [2] => 123 [3] => 55 ) この配列を "a","あ","123","55" といった1つの文字列として取得したいです。 <?php $list = array("a","あ","123",55); $r = ""; for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } $r = substr($r,1); echo $r; ?> このような形でできましたが、もっと良い方法はありますか? そして上の方法で良い場合は、下の1~4のどれが一番適切ですか? [1] for($i=0; $i<count($list); $i++){ $r .= ",\"".$list[$i]."\""; } [2] for($i=0; $i<count($list); $i++){ $r .= ',"'.$list[$i].'"'; } [3] foreach($list as $key => $val){ $r .= ",\"".$val."\""; } [4] foreach($list as $key => $val){ $r .= ',"'.$list[$i].'"'; }

    • 締切済み
    • PHP