从CSV输出特定行


Output specific row from CSV

我有一个小函数,它读取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将是第二列。在这种情况下为CCD_ 4和CCD_。

以下是功能:

$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;              
    }           
}

这将获取第一列匹配的行。但我想让它在第二个柱匹配的那一排。

我将提供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

任何帮助都将不胜感激!

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

示例#1(将CSV文件解析为数组的方便的一行代码):

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

示例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

用我的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;
    }
}