从CSV输出特定行

时间:2014-11-12 14:38:30

标签: php

我有一个小函数,它读取CSV文件并输出标题后面的所有行。

现在我想扩展此函数以接受location,因此只输出包含此location的行。我不确定如何做到这一点。

以下是CSV文件:

ID,Location,output,wdatatyp,wdb,wbyte,wbit,bitval,rdatatyp,rdb,rbyte,rbit
Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6
Lampe2Aus,Küche,#output2,DB,1,0,1,0,A,0,0,6

location将是第二个coloumn。在这种情况下WohnzimmerKüche

这是功能:

$id = $_GET['location'];
$rows = file('data.csv');
foreach ($rows as $row){
    echo $row;
    list ($id_num) = explode(",", $row);                
    if ($id_num == $id){
        echo $row;
        break;              
    }           
}

这将获取FIRST coloumn匹配的行。但我希望它能够获取SECOND coloumn匹配的行。

我将提供location,如此:

plc.php?function=LoadRoom&location=Wohnzimmer

因此,如果“位置”是Wohnzimmer,我需要输出看起来完全如此。

Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6

任何帮助都表示赞赏!

2 个答案:

答案 0 :(得分:3)

也许您应该考虑使用内置的PHP fgetcsv()(或str_getcsv,)函数来解析CSV字段,而不是使代码复杂化?

Example #1(用于将CSV文件解析为数组的方便的一行内容):

$csv = array_map('str_getcsv', file('data.csv'));

Example #2

$row = 1;
if (($handle = fopen("data.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}

或者使用函数分离逻辑,例如:

/**
 * Convert a csv string, or an array of items which
 * may contain csv strings, into an array of items.
 *
 * @param $args
 *   A simple csv string; e.g. 'a,b,c'
 *   or a simple list of items; e.g. array('a','b','c')
 *   or some combination; e.g. array('a,b','c') or array('a,','b,','c,')
 *
 * @returns array
 *   A simple list of items (e.g. array('a','b','c')
 */
function _convert_csv_to_array($args) {
  //
  // Step 1: implode(',',$args) converts from, say, array('a,','b,','c,') to 'a,,b,,c,'
  // Step 2: explode(',', ...) converts to array('a','','b','','c','')
  // Step 3: array_filter(...) removes the empty items
  // Step 4: array_map(...) trims extra whitespace from each item
  // (handles csv strings with extra whitespace, e.g. 'a, b, c')
  //
  return array_map('trim', array_filter(explode(',', is_array($args) ? implode(',',$args) : $args)));
}

来源:drush.inc

然后您可以像对待数组元素一样访问正确的元素($arr[0])。


基于上述内容,要解决您的特定问题,请查看以下示例代码:

$csv = 'ID,Breich,output,wdatatyp,wdb,wbyte,wbit,bitval,rdatatyp,rdb,rbyte,rbit
Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6
Lampe2Aus,Küche,#output2,DB,1,0,1,0,A,0,0,6'; // CSV data

$input = @$_GET['id'] ?: 'Breich'; // input column name
$value = @$_GET['value'] ?: 'Wohnzimmer'; // input value to search

$csv = array_map("str_getcsv", explode(PHP_EOL, $csv));
$keys = array_shift($csv);
$key = array_search($input, $keys);

while ($line = array_shift($csv)) {
    if ($line[$key] == $value) {
        print implode(',', $line) . PHP_EOL;
    }
}

// Outputs:
// Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
// Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6

答案 1 :(得分:0)

我的data.csv填充了这个:

ID,location,output,wdatatyp,wdb,wbyte,wbit,bitval,rdatatyp,rdb,rbyte,rbit
Lampe1Taster,Wohnzimmer,#output,DB,1,0,0,1,A,0,0,7
Lampe2Ein,Wohnzimmer,#output2,DB,1,0,1,1,A,0,0,6
Lampe2Aus,Küche,#output2,DB,1,0,1,0,A,0,0,6

这很好用。

$csv = file_get_contents('data.csv');               

$input = 'location'; // Welche Spalte soll gelesen werden
$value = $_GET['location']; // Wert dieser Spalte

$csv = array_map("str_getcsv", explode(PHP_EOL, $csv));
$keys = array_shift($csv);
$key = array_search($input, $keys);

while ($line = array_shift($csv)) {
    if ($line[$key] == $value) {
        echo implode(',', $line) . PHP_EOL;
    }
}