【问题标题】:Convert CR line break using SplFileObject使用 SplFileObject 转换 CR 换行符
【发布时间】:2013-08-28 08:36:17
【问题描述】:

我编写了一个类而不是扩展 SplFileObject 来打开 CSV 并具有关联数组。它有效,但如果 csv 文件使用 CR 换行符,则无效。

我知道你可以像这样转换字符串换行符:

$string = str_replace($this::CRLF, $string::LF, $file);
$string = str_replace($this::CR, $string::LF, $file);

但我想知道如何在构造函数中转换换行符。

我如何创建我的文件:

$file = new CSVFile(__DIR__ . '/../../Resources/data/myfile.csv');

CSVFile.php 类

use \SplFileObject;

class CSVFile extends SplFileObject
{
    private $keys;    

    public function __construct($file)
    {
        parent::__construct($file);
        $this->setFlags(SplFileObject::READ_CSV);
    }

    public function rewind()
    {
        parent::rewind();
        $this->keys = parent::current();
        parent::next();
    }

    public function current()
    {
        return array_combine($this->keys, parent::current());
    }

    public function getKeys()
    {
        return $this->keys;
    }

}

【问题讨论】:

    标签: php line-breaks


    【解决方案1】:

    不太确定你想做什么,但你尝试过吗? ini_set('auto_detect_line_endings',true);

    【讨论】:

    • 我正在导入带有扩展 SplFileObject 的类的 CSV 文件...你的想法不错,我要试试。
    【解决方案2】:

    我能想到的唯一方法(希望有一些我不知道的 php 支持)是读取文件,替换换行符,写入临时文件,然后打开临时文件。

    【讨论】:

    • 这可以处理小文件。您可以只是一个字符串变量而无需编写它。但我想保持逐行读取的优势,以防文件非常大......
    • @gagarine 我看不出问题?为什么不读取一行将其写入临时文件,然后逐行读取临时文件并解析它?!你甚至可以自己编写一个 CSV 解析器......它几乎是 readline()、explode()
    • 这就是重点,我无法逐行阅读,因为未检测到换行符:)。
    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多