【问题标题】:How to read a value from 'x'th row and 'y'th column in CSV using PHP?如何使用 PHP 从 CSV 中的第 x 行和第 y 列读取值?
【发布时间】:2012-12-04 05:48:24
【问题描述】:

我想知道是否可以从 CSV 中读取指定行号和列号的特定值。

假设我想从行号44 和列号K 读取数据?

我不想解析完整的 CSV。如何读取特定数据?

希望我的问题清楚吗?任何答案将不胜感激。

【问题讨论】:

  • 您的问题并不缺乏清晰性。但它缺少你迄今为止所做的代码。研究。
  • 我已经完成了从 CSV 读取的代码。但是我所有的研究都引导我从 CSV 逐行解析,直到达到目的。我正在寻找一种方法,您可以在其中轻松读取所需数据。
  • 你不能,CSV文件没有索引,所以你可以移动到文件中你想要解析的行开始的二进制位置。但是,如果您使用SplFileObject,则可以从缓冲读取中受益。
  • @hakre 谢谢。你能用工作示例详细说明一下吗??

标签: php csv fgetcsv


【解决方案1】:

CSV 文件没有索引,因此您至少需要转到第 44 行并检索它:

$file = new SplFileObject($path);
$file->setFlags(SplFileObject::READ_CSV);
$single = new LimitIterator($file, $offset = 43, $limit = 1);
list($row) = iterator_to_array($single, false);
$k = 10;
echo $row[$k];

【讨论】:

  • 不知何故我遇到了这个错误。可捕获的致命错误:传递给 LimitIterator::__construct() 的参数 1 必须实现接口 Iterator,F:\Source - WebAutomation\reuters\test.php 第 4 行中给出的整数
  • 谢谢。假设我也想要第 59 行,我应该用不同的偏移量再次 __contrut 'LimitIterator' 吗?
  • 不,那么我将首先将$file 包装在NoRewindIterator 中,然后在 43 处偏移,然后在 15 处偏移,以便从第 44 行移动到第 59 行。您可能会遇到不需要的副作用这样做(错误的行,例如从头开始),如果你这样做,请参阅stackoverflow.com/a/13828745/367456 了解详细信息(但你可能不这样做)。
  • 如果我不想遇到任何副作用,那么最好的方法是什么?
  • 如果您遇到副作用,您会注意到。如果它适合你,你可能不会在这种情况下。只有当相对限制太远时,您可能需要在中间添加一个缓存迭代器。不要对此感到困惑,您通常不需要它,只是想留下一个链接,以防未来用户对远程文件或其他东西进行操作。
【解决方案2】:
Here is a function that accepts the path to a CSV file, and inserts all records to the given MySQL table, paying attention to the column names: 

<?php 
function csv_file_to_mysql_table($source_file, $target_table, $max_line_length=10000) { 
    if (($handle = fopen("$source_file", "r")) !== FALSE) { 
        $columns = fgetcsv($handle, $max_line_length, ","); 
        foreach ($columns as &$column) { 
            $column = str_replace(".","",$column); 
        } 
        $insert_query_prefix = "INSERT INTO $target_table (".join(",",$columns).")\nVALUES"; 
        while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) { 
            while (count($data)<count($columns)) 
                array_push($data, NULL); 
            $query = "$insert_query_prefix (".join(",",quote_all_array($data)).");"; 
            mysql_query($query); 
        } 
        fclose($handle); 
    } 
} 

function quote_all_array($values) { 
    foreach ($values as $key=>$value) 
        if (is_array($value)) 
            $values[$key] = quote_all_array($value); 
        else 
            $values[$key] = quote_all($value); 
    return $values; 
} 

function quote_all($value) { 
    if (is_null($value)) 
        return "NULL"; 

    $value = "'" . mysql_real_escape_string($value) . "'"; 
    return $value; 
} 
?> 

【讨论】:

  • 这个含糊的答案到底是什么意思?我只想从第 x 行和第 y 列读取数据。你的答案是否相关?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多