![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.1ベストアンサー
- 回答日時:
CSVなどのファイルを開く場合は、基本的に
fopen関数
file関数
file_get_contents関数
ぐらいになると思いますが、
file関数はすべての行を配列に落とすため、メモリが一気に使用されます。
file_get_contentsもすべてのデータを取得して何らかの変数に代入するので、
配列ほどではないにしても一度にメモリを消費すると思います。
また、一度に巨大なデータを一気に取得して何らかの展開を行う方法では高速化はされませんので、
fopen関数を使い、whileなどでループさせながら、fgets(fread)関数で一行ずつ読み込みを行う、という方法になると思います。
そうしますと次に考えるのは、検索で一致した行を探すという内容ですが、
これは要件次第ですのでなんとも言えませんが、
fgetsしてきた一行から文字列を検索する方法で一番早いと思われるのは、strpos関数ですが、マルチバイトに対応していない為、今回は使えません。
mb_strpos関数もありますが、mbの類は結構遅いです。
なので、preg_matchを使用するのが一番早いと思います。
そして、preg_matchで適合したもののみ、配列などに代入していくと。
長々とここまで書きましたが、それでも速度に問題があるなら、データベースにデータを移して、SQLで検索をかけた方が良いと思います。
詳しい回答ありがとうございます。
やはりfopen関数になりますか。file関数はメモリを食う原因なので、私も使用はないかなぁ〜と思っています。内容に合致した1行を抽出するには、やはりfopen関数がもってこいですね。
私が気になっていたのはこのマルチバイトの扱いですが、ここはpreg_matchですか。とても参考になりました。
No.4
- 回答日時:
fopen()でファイルオープンしてでfgets()で取得して利用時にCSVをexplode()やstr_getcsv()で分割するなら
fgets()の代わりにfgetcsv()を使って取得時に配列に分離してしまった方が良いと思いますよ。
No.2
- 回答日時:
CSVファイルをパースしたあとにDBに突っ込んで検索させる。
CSVファイルを更新した場合には自動的にDBに保存しなおしさせるように仕込んでおく
次からはDBを読みに行けばいいだけ。
CSVが頻繁に更新されるのであれば、memcacheなどを使ってメモリに展開させておくかな。
いずれにせよ、ファイルを直接ずるずる引きずりまわすのはメモリも食うし何しても結果的に満足いく速度は出ない。
ご回答ありがとうございます。
なるほど、元のCSVファイルを更新するたびにDBに突っ込んでおくんですね。となると、検索はPHPでやるのでなく、DBに任せておくのが無難ですか。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
日本語を配列に収め、そして表...
-
DXFファイルをVBで取り込み、図...
-
テキストファイルを後ろから読...
-
RGBのバイナリデータをCImageに...
-
Cocoa+Objective-Cで、CSVファ...
-
ファイルの読みこみ方法とファ...
-
バイナリ出力
-
バイト型のデータを16進表記で...
-
VB4.0の「LSet」と同等の機能を...
-
ファイルのアクセス回数について
-
エクセルvbaでdocuworksprinter...
-
エクセルのプロパティーでセキ...
-
バッチファイル 二つ上のディ...
-
エクセルで複数のコメントのサ...
-
【マクロ】ファイル名の日付に...
-
Windows10でコマンドプロンプト...
-
エクセルのハイパーリンクがコ...
-
frxファイルの役目
-
csvファイル 項目数取得
-
カンマ区切りのCSVファイルから...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DXFファイルをVBで取り込み、図...
-
テキストファイルを後ろから読...
-
Cで2次元配列にCSVファイルを...
-
バイト型のデータを16進表記で...
-
ファイル入力のデータを構造体...
-
ファイル内の(&H0A)を(&H0D0A)...
-
RGBのバイナリデータをCImageに...
-
バイナリファイルの一部分をカ...
-
VBAでテキストファイルを複数開...
-
VBAでテキストファイルの改行を...
-
グレースケール画像の画素値を得る
-
Excel VBAで画像解析
-
[VBS] 16進数でバイナリファイ...
-
C言語でのファイル読み込み
-
VB4.0の「LSet」と同等の機能を...
-
Mscomm を使用してバイナリでデ...
-
fread関数の使い方がわかりませ...
-
Unicodeのファイル読み込みがう...
-
ファイルをメモリに出力する方法
-
CSVファイルによる検索の高速化
おすすめ情報