php - 从 CSV 输出特定行

标签 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

位置 将是第二列。在本例中为 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;              
    }           
}

这将获取第一列匹配的行。但我希望它获取第二列匹配的行。

我将像这样提供位置:

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 字段的函数?

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

关于php - 从 CSV 输出特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26889556/

相关文章:

php - 为什么页面仅在首页加载时才获取 undefined variable ?

PHP 将语义版本控制字符串转换为整数/ float

php - 我用ajax做了一条sql语句,但似乎没有任何反应

php - 在触发器中使用定界符的 Mysql 错误

php - 如何修复此错误 : "Undefined variable: sum"?

php - Laravel,同一 session 中 2 个域中的 2 个项目

javascript - JavaScript 中的字符串替换无法正常工作

php - 有没有办法用 Cron Job 加载页面?

PHP 脚本未将 Swift 数据插入 MYSQL 数据库

php - 2个日期之间的WordPress元查询