Вы уже работали с CSV-файлами? Если да, возможно, вы не попали в состояние нирваны, когда все работало нормально. Вы, конечно же, попадаете на нашу задницу, спаситель, замечательный, так полюбившийся stackoverflow.

После недавней работы ОЧЕНЬ МНОГО с CSV-файлами, я думаю, что у меня были все возможные проблемы и ошибки, которые у меня могли быть с этим, и поэтому я почувствовал необходимость создать этот пост. Я действительно не хочу, чтобы кто-то прошел через то, что прошел я.

Здесь я опубликую возможные проблемы и решения при работе с CSV-файлами, чтобы вы могли легко их решить и не рассердить своего менеджера / начальника / кого бы то ни было из-за того, что вам нужно так много времени, чтобы просто завершить задачу с файлом CSV.

Итак, приступим:

Кодирование

Вы столкнетесь с проблемами кодирования в вашем CSV в зависимости от того, в какой ОС он был сгенерирован и с помощью какого инструмента он был создан. Обычно, если вы создаете файл csv из старого MS Excel на Mac, он генерирует кодировку __western__, поэтому вам придется преобразовать его в utf-8 или любой другой код, который вы используете.

Если вы работаете с MySQL и хотите импортировать файл CSV непосредственно в базу данных, убедитесь, что все таблицы имеют формат utf-8 с utf8_unicode_ci в качестве сопоставления. Вы можете легко сделать это так:

ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Разделитель столбцов

Работая с CSV-файлами, вы получаете ОТЛИЧНЫЙ стандарт изменения разделителя столбцов в зависимости от вашего местоположения, конфигурации ОС или приложения, которое вы используете для создания CSV-файла. Это может быть запятая, точка с запятой, точка, знак доллара и т. Д. Например, обычно в США при экспорте в качестве разделителя столбцов используется запятая, поэтому он должен выглядеть так:

column1,column2,column3
value1,value2,value3
value1,value2,value3

БУУУУУТ… это было бы совсем иначе, чем в Бразилии (где я живу), вот так:

column1;column2;column3
value1;value2;value3
value1;value2;value3

Так что будьте готовы относиться к таким проблемам.

Разделитель строк

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

Если вы используете какой-либо сценарий для загрузки файлов CSV непосредственно в базу данных и видите, что сценарий завершился успешно, но без затронутых строк, очевидно, это означает, что ничего не было импортировано. Почему?

Например, в MySQL, когда вы используете LOAD DATA [LOCAL] INFILE, вам необходимо передать путь к файлу и несколько других параметров, например:

LOAD DATA LOCAL INFILE
 '/path/to/the/file.csv'
INTO TABLE your_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '"' 
LINES TERMINATED BY '\n' # ⚠️ the awesome mother hacker of my life
IGNORE 1 LINES

Не получится, если:

  • Вы используете старую версию Excel на своем Mac
  • Вы используете окна
  • Вы используете другое приложение для создания CSV, которое не разделяет конечные строки с \n

И вот что происходит, как сказано в документации MySQL:

Если вы создали текстовый файл в системе Windows, вам, возможно, придется использовать LINES TERMINATED BY '\r\n' для правильного чтения файла, потому что программы Windows обычно используют два символа в качестве признака конца строки. Некоторые программы, такие как WordPad, могут использовать \r в качестве символа конца строки при записи файлов. Для чтения таких файлов используйте LINES TERMINATED BY '\r'.

И еще одна проблема, связанная с этим, возникает, если ваш клиент меняет версию старого Excel на новую на Mac, например, что изменит \r на \n при экспорте CSV, что приведет к изменению сценария.

Вот и все, ребята!

Если вы нашли это полезным, покажите свою любовь аплодисментами и обменом информацией.
Если у вас есть что добавить сюда, дайте мне знать.

Twitter: @leodsgn
Linkedin: @leoribeirodsgn