Нежелательная строка новой строки / fputcsv

Итак, я пытаюсь использовать fputcsv, и он работает почти так, как задумано. У меня есть эта странная проблема, которую я не могу решить, и я не нахожу хорошей документации или даже людей, у которых есть эта проблема.

Когда есть строка, которая помещается в csv, в большинстве случаев все идет хорошо, но иногда она без всякой причины начинает новую строку в середине строки, когда я захожу в БД MySQL, она не показывает никаких такие вещи, как \n, даже странного характера.

Он просто начинает новую строку без всякой причины, иногда я вижу, что есть «длинное» слово, написанное так: «сегодня суббота.завтра воскресенье», а затем начинается новая строка после завтра, места нет между точкой и следующим словом, но это не кажется веской причиной начинать новую строку?

Когда я распечатываю массив, он также имеет ту же строку, которая заканчивается в этом месте... Кто-нибудь знает, что это может быть?

Мои извинения, если это не имеет никакого смысла...

РЕДАКТИРОВАТЬ: добавлен код и примеры

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,Name,Firstname,1970-01-01,1,3,4,"normal string",1,"dagelijks 2X te verzorgen. brandwonden 3 dagen geleden opgelopen door knalpot van brommer.
voornamelijk 2de grads brandwonden + открыть чудо",,,,,,"дата","дата",5,,1,,,1

После "броммер". есть новая линия...


person JELLEJ    schedule 21.07.2014    source источник
comment
он не показывает ничего вроде , /n — Вы на 100 % уверены, что это /n? Для новой строки используется синтаксис \n, если это имеет значение в вашем коде. Демонстрация кода и .csv примера поможет пролить свет на эту тему.   -  person Funk Forty Niner    schedule 21.07.2014
comment
@Fred-ii- добавил пример и код :) и да, я имел в виду\n извините за это   -  person JELLEJ    schedule 21.07.2014
comment
Что ж, из-за ваших stripslashes() простой \n — не управляющий символ, а просто обратный слеш, за которым следует n, — я думаю, в вашем выводе будет преобразован в новую строку. Можете ли вы перепроверить, что именно находится в вашей исходной базе данных для столбца, который разрывает строку? (Возможно, вы захотите проверить его символ за символом, например, используя что-то вроде SELECT ASCII(SUBSTRING(column_name, 34)) ..., чтобы найти точное значение ASCII 34-го символа...) Кажется подозрительным совпадением, что ваш пример новой строки находится точно в конце предложения. Я предполагаю, что в ваших исходных данных есть только новая строка.   -  person Matt Gibson    schedule 21.07.2014


Ответы (2)


Итак, я наконец нашел решение, которое я искал 2 дня назад. Похоже, что есть какой-то скрытый символ, потому что когда я заставляю PHP использовать функцию preg_replace и ставлю условие "\n-\x0B-\r", проблема решается.

Думал, что поделюсь, если у кого-то возникнет эта проблема в будущем.

person JELLEJ    schedule 21.07.2014

Я использовал 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);
person qualbeen    schedule 04.08.2014