【问题标题】:Converting CSV to array将 CSV 转换为数组
【发布时间】:2011-11-22 01:48:15
【问题描述】:

我有这个包含机场代码和城市名称的数组(大约 3500 行)。

code,city
"Abilene, TX ",ABI
"Adak Island, AK ",ADK
"Akiachak, AK ",KKI
"Akiak, AK ",AKI
"Akron/Canton, OH ",CAK
"Akuton, AK ",KQA
"Alakanuk, AK ",AUK
"Alamogordo, NM ",ALM

我需要将该文件转换为 php 数组。到目前为止,这是我的代码:

if(($handle = fopen('test.csv', 'r')) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ',', '"')) !== FALSE) {
        echo '<pre>';
            print_r($data);
            echo '</pre>';
    }
    fclose($handle);
}

虽然我正在为 fgetcsv 函数设置分隔符和包围字符,但结果是:

Array
(
    [0] => code
    [1] => city
"Abilene
    [2] => TX "
    [3] => ABI
"Adak Island
    [4] => AK "
    [5] => ADK
"Akiachak
    [6] => AK "
    [7] => KKI
"Akiak
    [8] => AK "
    [9] => AKI
"Akron/Canton
    [10] => OH "
    [11] => CAK
"Akuton
    [12] => AK "
    [13] => KQA
"Alakanuk
    [14] => AK "
    [15] => AUK
"Alamogordo
    [16] => NM "
    [17] => ALM
)

【问题讨论】:

  • 你确定这些是" 字符,而不是 MS 喜欢到处撒的花哨的 66 和 99?
  • 对我来说很好。可能是您的PHP_VERSION 中的一个错误。 (它是什么?)或者尝试var_dump(array_map("str_getcsv", file($fn)))
  • @StefanPantke:现在你提到了。他只得到了一张唱片。因此,无法识别的是换行符,因此引号也被误解了。
  • 另见php.ini设置auto_detect_line_endings
  • @StefanPantke:1 只是print_r() 的结果,它被echo 写出 print_r 本身已经抛出它的输出之后。 (为什么它也不在 pre 标签内。)

标签: php arrays csv fgetcsv


【解决方案1】:

如果是换行符,可以试试暴力破解方法:

$file = file_get_contents("test.csv");
$data = array_map("str_getcsv", preg_split('/\r*\n+|\r+/', $file));
print_r($data);

str_getcsv 在 PHP 5.3 中可用,或者作为手册中的解决方法,通过 upgradephpPHP_Compat

【讨论】:

  • 太好了,这解决了我的问题。非常感谢
  • 非常感谢您为未知的 upgradephp +1 !
【解决方案2】:

试试这个:-

ini_set('auto_detect_line_endings', TRUE);/// (PHP's detection of line endings) write at the top.


$csvrows = array_map('str_getcsv', file($filepath));
$csvheader = array_shift($csvrows);
$csv = array();
foreach ($csvrows as $row) {
   $csv[] = array_combine($csvheader, $row);
}

【讨论】:

    【解决方案3】:

    试试-

    $csv = array();
    
    if (($file = fopen('test.csv', 'r')) === false) {
        throw new Exception('There was an error loading the CSV file.');
    } else {  
       while (($line = fgetcsv($file, 1000)) !== false) {
          $csv[] = $line;
       }
       fclose($handle);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 2022-01-17
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      相关资源
      最近更新 更多