不需要的换行符字符串 / fputcsv

3
我正在尝试使用 fputcsv,它几乎按照预期工作。但我遇到了一个奇怪的问题,我无法解决,也找不到任何好的文档或甚至是有同样问题的人。
当有一个字符串被放入 csv 时,大多数情况下都很好,但有时会在字符串中间出现无缘由的换行,当我进入 MySQL 数据库时,它并没有显示类似于“\n”或其他奇怪字符的东西。
它只是无缘无故地开始了一行新的内容。有时我看到一个“长”的单词被写成这样:“today is saturday.tomorrow is sunday”,然后在明天之后开始了新的一行,句号和下一个单词之间没有空格,但这似乎不是开始新一行的好理由?
当我打印出数组时,在那个位置也有相同的行结尾... 有人知道可能是什么问题吗?
如果这没有任何意义,我深感抱歉...
编辑:添加了代码和示例
public function actionExportCSV()
{
    $model = Vicreg::model()->findAllByAttributes(array('event_id' => $_GET['eventid']));
    if($model){
        $output = fopen("php://output",'w') or die("Can't open php://output");
        header("Content-Type:application/csv"); 
        header("Content-Disposition:attachment;filename=verzorgingen.csv"); 
        fputcsv($output, array('id','event_id','name','firstname','dob','sex','urgency','pathology','pathology_other','treatment','treatment_other','medication','medication_other','material_other','material','docs','hour_in','hour_out','station_id','nurses_id','transport_id','hospital_id','ambulance_id','closed'));
        foreach($model as $vicreg) {
            $array = array();
            //if($vicreg->id == "83") { print_r($vicreg); exit(0); }
            foreach($vicreg->attributes as $key => $attribute) {
                $attribute = str_replace('  ', '', $attribute);
                $array[$key] = trim(stripslashes($attribute));
            }
            fputcsv($output, $array, ',' ,'"');
        }

        fclose($output) or die("Can't close php://output");
    } else {
        throw new CHttpException(422, 'Geen evenement opgegeven');
    }
}

示例

83,4,姓名,名字,1970-01-01,1,3,4,“普通字符串”,1,“每天2次护理。3天前因摩托车排气管烧伤。
主要是二度烧伤+开放性伤口”,,,,,,“日期”、“日期”,5,,1,,,1

“brommer.”后面有一个新行…


“它不显示任何类似于/n的东西”- 你确定是/n吗?对于换行符,语法应该是\n,如果这在你的代码中有所区别的话。展示代码和.csv样本将有助于阐明这个问题。 - Funk Forty Niner
@Fred-ii-添加了示例和代码 :) 是的,我是指 \n 对此感到抱歉 - JJ15
1
由于您使用了 stripslashes(),所以我认为一个简单的“\n”——不是控制字符,只是反斜杠后跟着一个n——会在输出中转换为换行符。您能否仔细检查一下换行的列中源数据库中确切的内容?(您可能需要逐个字符地检查它,例如使用类似 SELECT ASCII(SUBSTRING(column_name, 34)) ... 的东西来查找第34个字符的确切ASCII值...)看起来您的例子换行符恰好出现在句子的结尾,这似乎是一个可疑的巧合。我猜测您的源数据中只是有一个换行符。 - Matt Gibson
2个回答

0
我使用 preg_replace 来解决这个问题,所以这是我对同样问题的解决方案:
// $res: array of strings (with new lines)

foreach($res as $raw){
    $arr[] = preg_replace('/\s+/', ' ', trim($raw)); // Remove newlines from str
}
fputcsv($out, $arr);

0

好的,所以我终于找到了一个解决方案,我已经找了两天了。似乎有一些隐藏的字符,因为当我让PHP使用preg_replace函数并在条件"\n-\x0B-\r"中输入时,问题得到了解决。

我觉得我应该分享一下,如果将来有人遇到这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接