web-dev-qa-db-ja.com

csvファイルを解析して、最初に列名を取得し、次にそれに関連する行を取得するにはどうすればよいですか?

ここに私のcsvがあります

column1,column2,column3,column4,column5
column1_row1,column2_row1,column3_row1,column4_row1,column5_row1
column1_row2,column2_row2,column3_row2,column4_row2,column5_row2
column1_row3,column2_row3,column3_row3,column4_row3,column5_row3
column1_row4,column2_row4,column3_row4,column4_row4,column5_row4
column1_row5,column2_row5,column3_row5,column4_row5,column5_row5
column1_row6,column2_row6,column3_row6,column4_row6,column5_row6
column1_row7,column2_row7,column3_row7,column4_row7,column5_row7
column1_row8,column2_row8,column3_row8,column4_row8,column5_row8
column1_row9,column2_row9,column3_row9,column4_row9,column5_row9

もちろん最初の行は列名です。私はfgetcsv()を試しましたが、すべての行を表示するだけです。私が欲しいものではなく。どうすればできますか?

したがって、最後にデータを配列に入れると、Excelに表示されるのと同じように、データのテーブル形式を印刷できます。

ありがとう

これは私のサンプルです:

$filename = "upload/sample.csv";
if (($handle = fopen($filename, 'r')) !== FALSE)
{
    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) 
    {
       print_r($row);
     }
}

これは私の出力です:(私は$ rowをpreに入れて表示できるようにします)

Array
(
    [0] => column1
    [1] => column2
    [2] => column3
    [3] => column4
    [4] => column5
column1_row1
    [5] => column2_row1
    [6] => column3_row1
    [7] => column4_row1
    [8] => column5_row1
column1_row2
    [9] => column2_row2
    [10] => column3_row2
    [11] => column4_row2
    [12] => column5_row2
column1_row3
    [13] => column2_row3
    [14] => column3_row3
    [15] => column4_row3
    [16] => column5_row3
column1_row4
    [17] => column2_row4
    [18] => column3_row4
    [19] => column4_row4
    [20] => column5_row4
column1_row5
    [21] => column2_row5
    [22] => column3_row5
    [23] => column4_row5
    [24] => column5_row5
column1_row6
    [25] => column2_row6
    [26] => column3_row6
    [27] => column4_row6
    [28] => column5_row6
column1_row7
    [29] => column2_row7
    [30] => column3_row7
    [31] => column4_row7
    [32] => column5_row7
column1_row8
    [33] => column2_row8
    [34] => column3_row8
    [35] => column4_row8
    [36] => column5_row8
column1_row9
    [37] => column2_row9
    [38] => column3_row9
    [39] => column4_row9
    [40] => column5_row9
)
19
Sarmen B.

それを一度に読むためにあなたは使うことができます:

$csv = array_map("str_getcsv", file("file1.csv",FILE_SKIP_EMPTY_LINES));
$keys = array_shift($csv);

すべての行をNice連想配列に変換するには、次のように適用できます。

foreach ($csv as $i=>$row) {
    $csv[$i] = array_combine($keys, $row);
}
64
mario
// Opening the file for reading...
$fp = fopen('path_to_your_file.csv', 'r');

// Headrow
$head = fgetcsv($fp, 4096, ';', '"');

// Rows
while($column = fgetcsv($fp, 4096, ';', '"'))
{
    // This is a great trick, to get an associative row by combining the headrow with the content-rows.
    $column = array_combine($head, $column);

    echo $column['column1'];
}
3
Alex Sawallich

str_getcsvを使用してみてください— CSV文字列を配列に解析します

それはあなたの問題を解決するはずです...

0
Hacker

私はfgetcsvを使用してこの簡単なソリューションを作成しましたが、うまく機能し、読みやすく、理解しやすくなっています。次に、結果全体が$ csv配列に保存されます

$csv = array();
$i = 0;
if (($handle = fopen($upload['file'], "r")) !== false) {
    $columns = fgetcsv($handle, 1000, ",");
    while (($row = fgetcsv($handle, 1000, ",")) !== false) {
        $csv[$i] = array_combine($columns, $row);
        $i++;
    }
    fclose($handle);
}
0
Macr1408

それをすべて1行として扱っているようです。おそらく、csvの行末は本来あるべき行とは異なるのでしょうか?少なくともそれはあなたの出力では次のようになります。結果配列の行1、列5を見ると、行2に行末と列1が含まれており、残りも同じです。それをすべて1行として読み込みます。

注:もしPHPがMacintoshコンピュータ上またはMacintoshコンピュータで作成されたファイルを読み取るときに行末を正しく認識していない場合、 auto_detect_line_endings ランタイム構成オプションを有効にすると、問題の解決に役立つ場合があります- fgetscv

どのプラットフォームにいますか?いずれにしても、行末を確認してください。

0
Svish

私は最初の回答を変更して、異なる列セパレータをより適切に処理しました

if (($handle = fopen("hdbsource/products_stock.csv", "r")) !== FALSE) {
    while (($csv[] = fgetcsv($handle, 1000, ',')) !== FALSE) {}
    fclose($handle);
}
$keys = array_shift($csv);

foreach ($csv as $i=>$row) {
    $csv[$i] = array_combine($keys, $row);
}
0
StanleyD

最初にfgetcsvを呼び出してヘッダーを取得し、次にループを開始して残りを取得することはできませんか?

見つかった例を変更 マニュアル内 。次のヘッダーと値を含むテーブルを書き出します。

<?php
$row = 1;
if (($handle = fopen('test.csv', 'r')) !== FALSE)
{
    echo '<table>';

    // Get headers
    if (($data = fgetcsv($handle, 1000, ',')) !== FALSE)
    {
        echo '<tr><th>'.implode('</th><th>', $data).'</th></tr>';
    }

    // Get the rest
    while (($data = fgetcsv($handle, 1000, ',')) !== FALSE)
    {
        echo '<tr><td>'.implode('</td><td>', $data).'</td></tr>';
    }
    fclose($handle);
    echo '</table>';
}
?>
0
Svish