• ベストアンサー

PHPでCSVファイルから行指定してループする方法

こんにちは。 PHPでループ処理をしているのですが、ふと疑問にあたりました。 CSVファイルをオープンしそれを一行づつ読み込みたいのです。 「次のページ」などのよくある方法のように30行あったら次のページをクリック。 次ページでは31行目から60行目までを表示、その繰り返しのようなループを考えています。 Perlの場合foreach(1 .. 30){} のように配列の始点終点の指定ができたとおもうのですが、PHPでもこのような処理は可能なのでしょうか? 恐れ入りますがご教授お願いします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • jone
  • ベストアンサー率42% (6/14)
回答No.1

単純に配列内の任意の要素を取得したいのであれば、以下でいけるのでは? $target_data = array(); $target_data = データ取得//ロジックは省略 $target_data = array_slice($target_data, (int)オフセット[,(int)オフセットからの要素数]); 如何でしょう?

参考URL:
http://www.scollabo.com/banban/php/ref/ref_array_slice.html
titikun00
質問者

お礼

なるほど。array_sliceですね。 それならできるような気がしますね。 試してみます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

つい最近、この板で同じような質問を見た気がします。 過去ログをみてから質問してください。 foreach (range(1, 30) as $number) { echo $number; } http://www.php.net/manual/ja/function.range.php

titikun00
質問者

お礼

返信ありがとうございます。 range(1,30)は1行目から30行目ということではなく、1という数値から30という数値までということではないのでしょうか? array(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,) でいうなら0、10、30の3行しかとりだせないのでは? まちがっていたなら申し訳ないです。

関連するQ&A

  • 【PHP】csvファイルへの書き出し(1行追加or1行上書き)について

    【PHP】csvファイルへの書き出し(1行追加or1行上書き)について はじめて利用させていただきます。 現在、PHPにて書き出し処理を作成している者ですが、csvファイルへの書き出しの際に先頭行にスペースが大量に入ってしまい、困っています。 自分なりに調べてみたのですが、原因がわかりません。詳しい方からのアドバイスをお願いしたいです。 【行っている処理】 1.csvファイルを1行ずつ読み込み、配列に格納 2.既存のデータに同じ名前の人が存在する場合は、その行の配列の内容を変更(存在しない場合は配列の末尾に1件追加) 4.現在ファイルにあるデータを削除(丸めこみ)し、配列データを書き書き出し 【ソース】(書き出し処理に問題があると思ったため、それ以外の部分は割愛させていただきます) <?php $filename = 'data.csv'; $file = fopen($filename, "r+" ); $name = array(); if(flock($file,LOCK_SH)){ while( $data = fgetcsv( $file, 1000, "," ) ) {   //配列に格納 } //配列の内容変更or新規に一行追加処理 //現在のファイル内のデータを削除(まるめこみ) ftruncate($file, 0); //1行分のデータをカンマ区切りで結合し、書き出し for($i = 0; $i < $count; $i++){ $ins = $name[$i]; $ins .= ','; $ins .= $number[$i]; //書き込み失敗時のエラー if(fwrite($file, "$ins\n" ) === FALSE){ print("ファイル書き込みに失敗しました"); }else{ //処理なし } } //ファイルロック解除 flock($file, LOCK_UN); }else{ print("ファイルロックに失敗しました"); } 【csvファイルの中身(処理実行前)】 佐藤,1234 田中,12345 中村,9876 【csvファイルの中身(処理実行後)】                       佐藤,1234 田中,12345 中村,9876 以上です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpでcsvファイルから二次元配列を作る

    php初心者です。 phpでcsvファイルを読み込んで、 配列[csvの行番号][項目名(csv一行目の内容)]=各々の値 という二次元配列を作りたいのですが、作り方が全く分かりません。 どなたか教えてください。

    • ベストアンサー
    • PHP
  • PHP5でCSVの指定行データだけを取得するには?

    PHP初心者です。 下記のような方法で全てのデータを取得する方法があると知りました。 $fp = fopen("url.csv", "r"); while ($data = fgetcsv($fp, 1)) { foreach ($data as $d) { print $d . "<br>\n"; } } しかし指定行、例えば10行目等だけを取得する方法がわかりません。 CSVは1列で1000行ほどあります。 恐れ入りますが具体的なソースを教えてくださいませ。

    • ベストアンサー
    • PHP
  • PHPのループ数限界値について

    PHPのループ数限界値について 宜しくお願い致します。PHP 5.1.6を使用しております。 PHPのforやwhileのループ処理について、限界のループ数というのは存在するのでしょうか? 今作っているプログラムで、約15,000項目の配列と約10,000項目の配列で2重のループ処理しています。 この場合のループ数は15,000×10,000=150,000,000回の繰り返し回数となってしまいます。 しかも、この配列数は今後も増える可能性が高いです。 ループの限界値が何回なのか、教えてください。

    • ベストアンサー
    • PHP
  • PHP5+MySQL5 CSVから、更新、追加する処理の書き方

    こんにちは。 PHP5とMySQL5を使っています。 CSVファイルを読み込み、キーが存在するレコードは更新、 存在しなければ追加、という処理について 色々な書き方を教えて頂けたらと思います。 例えば、フィールドは、ユニークキーとなる[ID]、 [Name]、[TEL]の3つとします。 1.CSV読む 2.行と列の2次元配列に格納 3.行数分ループ開始 3-1.IDをキーに、SELECT 3-2.存在したら 3-3.UPDATE更新 3-2.存在しなかったら 3-3.INSERT追加 4.行数分ループ終了 と考えています。 CSVに100行あったら、100回SELECT掛けることになりますが、 この書き方で問題ないでしょうか? もっと判り易い、こんな書き方も! というのがありましたら、是非頂けますでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでcsvファイルを読みチェックを行う

    PHPの初心者です。よろしくお願いします。 やりたいことはCSVファイルを一行ずつ読んで 条件を満足させているかをチェックする機能です。 例: 00658,658,1,1,0,50,60,1 00658,658,1,1,0,50,60,1, 00658,658,1,1,0,50,60,1, 00658,658,1,1,0,50,60,1 00658,658,1,1,0,50,60,1 00658,658,1,1,0,50,60 00658,658,1,1,0,50,60,1 00658,658,1,1,0,50,60,1 上記のようなCSVファイルを一行ずつ読んで ガンマの数、またはガンマ区切りのカウント数を 判断の条件としてチェックを行います。 決めた数より多かったり少なかったりする行は 表示する機能を完成させたいですが どなたか詳しいかたがいらっしゃるんであれば 教えていただきたいです。 いまのところはCSVファイルを全部読んで 全部出力することはできました。またsplitを使って その数を数えようと思ったんですがなかなかうまくいきません。よろしくお願いします。

    • ベストアンサー
    • PHP
  • RubyでCSVファイルの1行目を削除したい 

    Rubyの初心者でSeleniumを使ってスクレイピングを趣味としてしているものです。 ブラウザはchromeです。 この間、例外が上がったときに一定回数リトライする方法をご伝授頂きました。 http://okwave.jp/qa/q8722965.html そしてそれを活用して、CSVにスクレイピングをしたいURLを1列目に並べ、複数のページをスクレイピングしているのですが、 def try(n=10) require 'pp' require 'csv' require 'selenium-webdriver' require 'open-uri' hoge_path = File.expand_path('../hoge.csv',__FILE__) driver = Selenium::WebDriver.for :chrome #chrome のdriverを設定 CSV.foreach(hoge_path) do |row| driver.navigate.to row[1] #URL移動 #ページの移動など driver.quit #ブラウザ終了 driver = Selenium::WebDriver.for :chrome #chrome のdriverを設定 end rescue => e if n==0 raise e driver.quit #ブラウザ終了 else driver.quit #ブラウザ終了 try(n-1) end end try よく仕組みを理解できていないのですが、CSV.foreach内はループされます。 そして、404エラーなどで落ちるとまた一行目に戻ってスクレイピングが行われ、非常に困っています。 そこで、CSVファイルの1行目をループするまたは例外のリトライの際に削除していけば良いと考えたのですが、一行目を削除するというコードをどう書けばいいのか分かりません。 どうかご伝授お願いします。

    • ベストアンサー
    • Ruby
  • 外部のCSVファイルをPHPで読み込み、出力させたい

    下記の質問を参考に外部のCSVファイルをPHPで読み込み、出力させるphpを書きました。 http://oshiete1.goo.ne.jp/qa1615206.html data.csvは "データ01" "データ02" "データ03" ・・・ といったように100行書いてあります。 <1ページ目に記述したphp> <?php $fp = fopen("data.csv", "r"); $repeat = 10; $count = 1; while ($data = fgetcsv($fp, 10000)) { if ($count > $repeat) { break; } print <<<EOD $data[0] EOD; $count++ ; } fclose ($fp) ?> 2ページ目には11行目からのデータを出力したいと思い、 $data[0]の部分を$data[11]に変えたり、 $repeat = 20; $count = 11;にしたりしたのですが、 両方ともうまくいきませんでした。 2ページ目にcsvの11行目からのデータを出力するにはどうすればいいのでしょうか? 私がしたいことは、1ページ目にcsvの1~10行目を、2ページ目にcsvの11~20行目を出力したいとおもっております。 上記のphp以外の記述でも構いませんので、どなたかお分かりになる方がいらっしゃいましたら是非教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • CSVファイルの行と列のセルってどうやって指定するのですか?

    たとえば、1行目の2列目のセルの値を消したい。 2行目の5列目のセルの値に数字の5をいれたい。 って場合、行だったら $FILE=data.csv; open(IN, $FILE); @data=<IN>; close(IN); このときの $data[2]は3行目ですよね? では3行目の3列目はどうやって指定するのでしょうか?たとえば3行目の3列目のセルの数字の5だったのをperlを実行したらセルの中を6に書き換えるのはどうしたらいいのでしょうか?

    • ベストアンサー
    • Perl
  • 行単位のデータ比較とカウントアップ方法について

    皆様のお知恵を拝借したく投稿しました。 よろしくお願いします。 perlでのデータ処理で2つの入力ファイルがあります list1 list2 ----------------- ------------------ start end start end 1 10 6 8 12 16 7 14 20 30 35 39 34 42 41 47 80 89 110 130 ----------------- ------------------ この2つのファイルを比較して以下の処理を行ないます (1)list1から見たlist2の1行目を比較し、領域の重複が見られたら両方にフラグを立てる →この場合領域6 - 8で重複が見られる (2)両方の終点を比較し、終点値の小さい方をカウントアップ(次の行へ進む) →1行目の場合、list2の終点が小さいのでlist2の行を進める (3)list1の1行目とlist2の2行目を比較する (4)終点を比較して終点の小さい方の行をカウントアップする →以下(1)~(4)の行程を繰り返す。 (5)上例を比較の流れは以下のとおりになります list1 1-10 , list2 6-8 list1 1-10 , list2 7-14 list1 12-16 , list2 7-14 list1 12-16 , list2 35-39 list1 20-30 , list2 35-39 list1 34-42 , list2 35-39 list1 34-42 , list2 41-47 list1 80-89 , list2 41-47 list1 110-130 , list2 41-47(行数が足りなくなったらlist2の最後の行と比較する) 最終的にlist1,list2の重複のあるフラグ数をカウント、出力する と言うアルゴリズムです コーディングの流れとしては (1)双方の二次元配列をループで回す (2)始点に注目して重複がないか比較する (3)終点を比較して該当するリストの行数のカウントアップをする というふうになると思うのですが、 (3)のやり方と、最後の片方のリストの行数が足りなくなったときの 比較とカウントアップのやり方がよく実装できません これをperlでコーディングしたいのですが どのようにしたらよいのでしょうか? ご助言いただけますと幸いです

    • ベストアンサー
    • Perl

専門家に質問してみよう