-2

我目前正在使用这个脚本:

<?php function jj_readcsv($filename, $header=false) { $handle = fopen($filename, "r"); echo '<table>'; //display header row if true if ($header) {
    $csvcontents = fgetcsv($handle);
    echo '<tr>';
    foreach ($csvcontents as $headercolumn) {
        echo "<th>$headercolumn</th>";
    }
    echo '</tr>'; } // displaying contents while ($csvcontents = fgetcsv($handle)) {
    echo '<tr>';
    foreach ($csvcontents as $column) {
        echo "<td>$column</td>";
    }
    echo '</tr>'; } echo '</table>'; fclose($handle); } jj_readcsv('partitiontable.csv',true);

?>

我有一个 8 列的 CSV 表。我想知道在进行查询时是否可以只获取列的元素。这是我的 CSV 的样子:

"HEMSI, Alberto",P_000001,P_1,Partition,169864,"Hemsi, Myriam","HEMSI, Alberto","Una matica de ruda",
"HEMSI, Alberto",P_000002,P_2,Partition,169865,"Hemsi, Myriam","HEMSI, Alberto","Ya salio de la mar",

这个想法是:查询一个值,例如:P_1 并得到结果:Una matica de ruda

对于每一行,当询问 P_1 获取第 8 列中的值时。P_2 也一样

4

3 回答 3

3

是的,这可以使用两种方法:

  1. 在开始时创建一个关联数组并将第 4 列作为键插入,并将第 8 列作为值插入。然后在所有进一步的代码中将其用作查找表。
  2. 如果您不执行 1. ,则可以创建一个遍历 CSV 数据的 for 循环,并使用 IF 查找第 4 行值是您要查找的值。找到后,返回第 8 列值。

使用关联数组的第一种方法示例

<?php

$array = array();
jj_readcsv("csv.txt");

echo $array["P_1"]."<br/>";
echo $array["P_2"]."<br/>";

function jj_readcsv($filename, $header = false)
{
    global $array;
    $row = 1;
    if (($handle = fopen($filename, "r")) !== FALSE) {
    echo '<table>'; //display header row if true if ($header) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        //print_r($data);
        $num = count($data);
        echo '<tr>';
        for ($c=0; $c < $num; $c++) {
           if($row > 1)
           echo "<td>$data[$c]</td>";
           else
           echo "<th>$data[$c]</th>";

           if($c==2)
           $array[$data[$c]]= $data[7];
        }
        echo '</tr>';
        $row++;
        }
        fclose($handle);
    }
}

?>
于 2013-06-05T16:30:05.127 回答
0

即使你命名了你的函数jj_readcsv(),如果你仔细观察,这个名字是个骗子,这个函数做的更多:打开一个文件,读取行。

如果您不想分离关注点但又想轻松修改它,只需将实际读取方法设为可选:

function jj_readcsv($filename, $header = FALSE, callable $fgetcsv = NULL)
                                                ########################
{
    $fgetcsv || $fgetcsv = 'fgetcsv';
    #################################

    $fileHandle = fopen($filename, "r");
    if (!$fileHandle) {
        return;
    }

    $csvLine    = $fgetcsv($fileHandle);
                  #####################
    echo '<table>';

    echo '<tr>';
    foreach ($csvLine as $headercolumn) {
        echo "<th>$headercolumn</th>";
    }
    echo '</tr>';

    while ($csvLine = $fgetcsv($fileHandle)) {
                      #####################
        echo '<tr>';
        foreach ($csvLine as $column) {
            echo "<td>$column</td>";
        }
        echo '</tr>';
    }

    echo '</table>';

    fclose($fileHandle);
}

这个小修改允许您指定读取功能,因此您可以控制读取的内容。所以你可以将它作为第三个参数注入,例如只返回第八列:

jj_readcsv('test.csv', FALSE, function($fileHandle) {
    if ($csvLine = fgetcsv($fileHandle))
    {
        $csvLine = [$csvLine[7]];
    }

    return $csvLine;
});

输出:

<table><tr><th>Una matica de ruda</th></tr><tr><td>Ya salio de la mar</td></tr></table>
于 2013-06-06T15:59:58.910 回答
0

尝试这个:

$row = 1;
$handle = fopen ("teste.csv","r");
$head = Array();

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

    //register head rows with names
    if($row == 1){
        $num = count ($data);
        for ($c=0; $c < $num; $c++) {
            $colName = trim($data[$c]);
            $head[$colName] = $c;
        }
    }else{
        echo $data[$head['COL_NAME']];
    }

    $row++;
}


fclose ($handle);

这将使 var $head 成为一个关联数组,其中键是 col 名称和值他在 csv 中的位置,之后您可以轻松识别您想要的 col。

于 2013-06-05T19:54:30.387 回答