MySQL: возврат каретки в запросе - PullRequest
8 голосов
/ 23 июня 2009

У меня есть запрос, который экспортирует данные из двух столбцов каждой строки в файл. В файле данные из каждого столбца должны быть отделены символом возврата каретки, примерно так:

row1column1
row1column2
row2column1
row2column2
row3column1
row3column2

Я пытался использовать char (13):

SELECT CONCAT(column1, char(13), column2) FROM my_table INTO outfile 'my_file'

и выходной файл выглядел совершенно нормально (данные каждого столбца были в другой строке), но когда я использовал его в качестве входных данных для программы, которая должна принимать описанный формат, он не распознал ее. Однако, когда я вручную удалил все возвраты каретки в файле и снова добавил их, нажав клавишу «Ввод», моя программа без проблем распознала файл. Когда я попытался использовать char (13), char (10), мой выходной файл выглядел так:

row1column1
\
row1column2
row2column1
\
row2column1

Я уверен, что я упускаю что-то очевидное здесь:)

Ответы [ 4 ]

7 голосов
/ 23 июня 2009

Я вижу это на сайте MySQL, надеюсь, это поможет вам.

Вы должны использовать следующий синтаксис для создать файл CSV в формате ожидается Microsoft Excel:

... INTO OUTFILE '/temp.csv' ПОЛЯ ESCAPED BY '""' TERMINATED BY ',' ЗАКРЫТЫЕ "" "ЛИНИИ, ПРЕКРАЩЕННЫЕ '\ Г \ п';

Однако поля с возвратом каретки может сломать CSV, как MySQL будет автоматически закрывать поле, когда Обнаружен разрыв строки \ r \ n. Работать вокруг этого замените все разрывы \ r \ n с \ n. Поле не закрывается на \ n перерывы, и он будет прочитан в одна ячейка в Excel. Вы можете сделать это в том же операторе SQL, для Пример:

SELECT REPLACE (field_with_line_breaks, '\ r \ n', '\ n') ИЗ таблицы В OUTFILE '/temp.csv' ПОЛЕ ESCAPED BY '""' ПРЕКРАЩЕНО ',' ЗАКРЫТО '' ' ЛИНИИ, ПРЕКРАЩЕННЫЕ '\ r \ n';

Я также обнаружил, что нулевые значения могут сломать CSV. Они могут быть обработаны в Аналогичным образом:

ВЫБРАТЬ IFNULL (возможный_нул_поле, "") ИЗ таблицы В OUTFILE '/temp.csv' ПОЛЯ, УДАЛЕННЫЕ "" ", ПРЕКРАЩЕНЫ ',' ЗАКРЫТЫЕ '' 'ЛИНИИ ПРЕКРАЩЕНЫ BY '\ r \ n';

Примечание: это заменяет значения NULL на пустая строка, которая технически не то же самое, но это даст вы пустую ячейку в Excel вместо нарушая структуру CSV и сдвигая следующие ячейки к влево.

5 голосов
/ 16 октября 2010

Ответ Хаима Евгения работает, но:

SELECT REPLACE(field_with_line_breaks, '\r\n', '\n') FROM table INTO OUTFILE '/temp.csv' FIELDS ESCAPED BY '""' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

Я должен был измениться на:

SELECT REPLACE(field_with_line_breaks, '\r\n', '\n') FROM table INTO OUTFILE '/temp.csv' FIELDS ESCAPED BY '"' TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n';

В FIELDS ESCAPED BY была двойная кавычка, которая выдает эту ошибку в mysql: «Ошибка 1083: Аргумент разделителя полей не соответствует ожидаемому; проверьте руководство».

Изменение его в одинарную кавычку остановило ошибку и экспортировало файл. После этого я смог успешно импортировать его в Excel с правильно отформатированными строками.

4 голосов
/ 23 июня 2009

Попробуйте просто char (10) - это "\ n" - способ UNIX.
Просто char (13) «\ r» - это (старый) способ mac, а «\ r \ n» - это способ Windows, но я подозреваю, что MySQL просто использует \ n для каждой строки, поэтому вам нужно сопоставить это.

1 голос
/ 23 июня 2009

Возможно, у вас есть проблемы с различиями в интерпретации новой строки между операционными системами.

Если ваша база данных MySQL находится в Unix / Linux, и файл будет прочитан в Unix или база данных находится в Windows и будет прочитана в Windows, попробуйте следующее:

select * into outfile 'my_file'
fields terminated by '\n' lines terminated by '\n'
from my_table;

Если ваша база данных MySQL работает на Unix / Linux и файл будет считан в Windows, попробуйте следующее:

select * into outfile 'my_file'
fields terminated by '\r\n' lines terminated by '\r\n'
from my_table;

Вы также можете преобразовать файл между символами новой строки "CRLF" (Windows) и "LF" (Unix), используя небольшую утилиту командной строки под названием dos2unix и unix2dos, которая включена в большинство дистрибутивов Linux.

...