3

.csv ファイルからデータを読み取って、Web ページにテキストとして出力しようとしています。

これを行うのは初めてで、厄介な小さな問題に遭遇しました。

私の .csv ファイル (デフォルトで Excel によって開かれます) には複数の行があり、全体を 1 つの長い文字列として読み取ります。

このような:

$contents = file_get_contents("files/data.csv");

私が作成したこの例のファイルには、2 行あります。

Paul Blueberryroad 85 us 懐中電灯、バッグ 2008 年 11 月 20 日、午後 4 時 39 分

Hellen Blueberryroad 85 us lens13mm,Flashlight,Bag,ExtraBatteries 2008 年 11 月 20 日 16:41:32

しかし、PHP によって読み取られる文字列は次のとおりです。

ポール;Blueberryroad 85;us;Flashlight,Bag;2008 年 11 月 20 日、午後 4 時 39 分Hellen;Blueberryroad 85;us;lens13mm,Flashlight,Bag,ExtraBatteries;2008 年 11 月 20 日 16:41:32

私はこれを次のように分割しています:

list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);

私が望むのは、 $name[] がその内容として「ポール」と「ヘレン」を含むことです。そして、それぞれの列の値を受け取る他の配列。

代わりに、ポールのみを取得し、$orderdate[] の内容は

2008 年 11 月 20 日午後 4 時 39 分ヘレン

したがって、すべての行が連結されます。誰かが私が必要なものを達成する方法を教えてもらえますか?

編集:解決策が見つかりました。残っている奇妙なことは1つだけです:

このコードを使用して解決しました:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

何らかの理由で、私の CSV ファイルには 2 行しかありませんが、2 つの配列と 1 つのブール値が返されます。最初の 2 つはデータ配列で、ブール値は 0 です。

4

5 に答える 5

11

CSV ファイル構造を認識し、CSV ファイルを処理するためのオプションが指定されているfgetcsv()を使用することをお勧めします。または、代わりにファイルの内容に対してstr_getcsv()を使用できます。

于 2008-11-22T16:07:46.403 に答える
1

このコードを使用して解決しました:

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

何らかの理由で、私の CSV ファイルには 2 行しかありませんが、2 つの配列と 1 つのブール値が返されます。最初の 2 つはデータ配列で、ブール値は 0 です。

于 2008-11-22T16:28:38.157 に答える
1

file()関数は配列内のファイルを読み取ります。すべての行が配列のエントリです。

したがって、次のようなことができます。

$rows = array();
$name = array();
$street = array();
$country = array();

$rows = file("file.csv");
foreach($rows as $r) {
    $data = explode(";", $r);
    $name[] = $data[0];
    $street[] = $data[1];
    $country[] = $data[2];
}
于 2008-11-22T16:06:55.657 に答える
0

もちろん、最良の方法は、指摘されているように fgetcsv() です。

$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
    $arr[] = $data;
fclose($f);

しかし、変数に内容があり、それを分割したい場合は、str_getcsv を使用できません。これを使用できます。

function str_split_csv($text, $seperator = ';') {
    $regex = '#' . preg_quote($seperator) . '|\v#';
    preg_match('|^.*$|m', $text, $firstline);
    $chunks = substr_count($firstline[0], $seperator) + 1;
    $split = array_chunk(preg_split($regex, $text), $chunks);
    $c = count($split) - 1;
    if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
        unset($split[$c]);
    return $split;
}
于 2008-11-22T16:49:50.953 に答える
0

fgetcsv についての発言は正しいです。

教育目的で、引き続きあなたの質問にお答えします。まず、データ (カンマ付き) と "PHP によって読み取られた文字列" (一部のスペースをセミコロンに置き換えますが、すべてではありませんか?) の違いがわかりません。PS .: メッセージのソース コードを確認しましたが、TSV (タブ) と CSV (コマ) が奇妙に混在しているように見えます。

さらに、この方法で移動したい場合は、最初にファイルを行に分割し、次に行をフィールドに分割する必要があります。

于 2008-11-22T16:16:56.823 に答える