【问题标题】:php csv import data but in one arrayphp csv 导入数据但在一个数组中
【发布时间】:2017-03-09 10:51:31
【问题描述】:

CSV 中的数据如下所示,只有一列

| BeKwX8iN3wzHDvCaxBD1 |
| 3rPB9t6EF3RGla28YbLE |
| OAYRwbrkctcVbrXaaTef |
| N8lxYdvx47FI7eYt5FUX |
| zwtRdHr3aYYnX9avcMjX |
.....

文件内容看:https://drive.google.com/a/hiiir.com/file/d/0B4ZVHStLEPq3bklUUHkzbDN1MkE/view?usp=sharing

代码

$row = 1;
    if (($handle = fopen($serial['tmp_name'], "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);
    }

问题是当我打印$num时,我得到了int(1),因为它们都在一个array()中

array(1) {
  [0]=>
  "BeKwX8iN3wzHDvCaxBD1
  3rPB9t6EF3RGla28YbLE
  OAYRwbrkctcVbrXaaTef
  N8lxYdvx47FI7eYt5FUX
  zwtRdHr3aYYnX9avcMjX"}

我知道fgetcsv()由$delimiter控制,这个案例是,,但它不适合我的案例。可以分隔 20 个字符吗?

【问题讨论】:

  • 似乎没有真正的 CSV,所以为什么要使用 fgetcsv 如果文件的每一行看起来像 |abc| 然后使用 array_map(function($a){ return trim($a,'|');},file($serial['tmp_name'])); 以获取数组中的数据(到达行的一个条目)或使用fgets() 而不是 fgetcsv()
  • 您可以将$delimiter 更改为您需要的任何内容,阅读更多:php.net/manual/en/function.fgetcsv.php

标签: php csv fgetcsv


【解决方案1】:

您不能使用 fgetcsv 读取固定长度的 CSV,您必须自己完成。

[编辑] 这里的问题不是 CSV 问题,它是由结束行“\r”引起的。请参阅下面的 cmets 来处理它。 [/编辑]

在您的情况下,请使用分隔符参数:

$data = fgetcsv($handle, 1000, "|")

您的代码示例:

<?php

if (($handle = fopen('csv.txt', "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, "|")) !== FALSE) {
        array_pop($data);
        array_shift($data);
        var_dump($data);
    }
    fclose($handle);
}

结果:

array(1) {
  [0]=>
  string(22) " BeKwX8iN3wzHDvCaxBD1 "
}
array(1) {
  [0]=>
  string(22) " 3rPB9t6EF3RGla28YbLE "
}
array(1) {
  [0]=>
  string(22) " OAYRwbrkctcVbrXaaTef "
}
array(1) {
  [0]=>
  string(22) " N8lxYdvx47FI7eYt5FUX "
}
array(1) {
  [0]=>
  string(22) " zwtRdHr3aYYnX9avcMjX "
}

【讨论】:

  • 嗨,|还是不行,是源文件格式问题吗?
  • 我下载了你的文件。这是 Apple 新行“\r”。这就是这里的问题。您有 2 个选项:在您的脚本中使用 ini_set('auto_detect_line_endings', true); 或首先读取整个文件并将 \r 转换为 \n。编辑:如果您的单元格分隔符是,,请忘记|
  • 谢谢! ini_set('auto_detect_line_endings', true) 有效!
  • 如果我想将 \n 转换为 \r ,我尝试设置 $handle = preg_replace("\n","\r",$handle);在 while 循环之前,但我收到了警告 preg_replace(): Delimiter must not be alphanumeric or backslash
  • preg_replace 是一个基于正则表达式的函数。正如错误所说,它不能是字母数字或\。我通常使用 / (或 # 当我有 / 模式时):preg_replace('/\n/', "\r", fgets($handle)) 是你想要的。根据您的需要, str_replace("\n", "\r", fgets($handle)) 可以解决问题。
猜你喜欢
  • 2014-09-19
  • 2012-07-11
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 2014-05-01
相关资源
最近更新 更多