【问题标题】:Remove line breaks from CSV data string (pre PHP 5.3)从 CSV 数据字符串中删除换行符(PHP 5.3 之前)
【发布时间】:2014-04-01 11:01:15
【问题描述】:

我有一个包含 CSV 文件内容的大字符串。到目前为止,我并不关心解析它,因为我的程序只是将它从一个源流式传输到另一个源。

如果您决定接受它,您的任务是告诉我从包含多个 CSV 数据行的字符串的数据元素中删除换行符的最佳方法,而不丢弃分隔行本身的换行符。数据引用正确,实现必须在 PHP 5.2 上运行...

id,data,other
1,"This is data
with a line break I want replacing",1
2,"This is a line with no line break in the data",0
3,No quotes,42
4,"Quoted field with ""quotes inside"" which is tricky",84

【问题讨论】:

  • 你能详细说明removing line breaks without throwing away the line breaks吗?在我看来,数据和预期结果的示例也可以改善您的问题。
  • 每行是否包含固定数量的字段,我的意思是您需要一些信息来指示单行。例如。每 5 个逗号我们就有一行。
  • 所有 CSV 数据都包含固定数量的字段。 :-)。 @AndriusNaruševičius 添加示例
  • 仍然不清楚 “删除,但不丢弃” 应该是什么意思。无论如何,你的任务是 RTFM,php.net/manual/en/function.fgetcsv.php——这将以正确的方式为你提供数据。之后你用它做什么,取决于你。

标签: php csv


【解决方案1】:

我认为,如果 CSV 数据内部有换行符,则该行上必须有奇数(未配对)引号。如果存在这样的行,则删除其换行符并检查新创建的行是否有效。 以下伪 PHP 代码应该可以工作。事情线ReadercontainsOddNumberOfQuotes() 在PHP 5.2 中很容易实现:

function fixCsv($fileOrString) {
    $reader = new Reader($fileOrString);
    $correctCsv = "";
    while ($reader->hasMoreLines()) {
        $correctCsv = $correctCsv . fixLine($reader, $reader->readLine()) . "\n";
    }
    return $correctCsv;
}

/** Recursive function that returns a valid CSV line. */
function fixLine($reader, $line) {
    if (containsOddNumberOfQuotes($line)) {
        if ($reader->hasMoreLines()) {
            // Try to make a valid CSV line by joining this line with the next one.
            return fixLine($reader, line . $reader->readLine())
        }
        throw new Exception("Last line is incomplete.");
    }
    else {
        return $line;
    }
}

【讨论】:

    猜你喜欢
    • 2014-07-23
    • 2013-09-08
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    相关资源
    最近更新 更多