2016-09-07 16 views
1

Я потратил немало времени на поиски в Google, но я не могу показать себя в правильном направлении именно того, что я ищу. Проблема с моим .csv-файлом заключается в том, что, хотя терминатор линии «,,,,», некоторые строки не включают это, поэтому, когда я импортирую файл, это нормально, пока он не достигнет одного из них, но затем он обрабатывает его как одна запись, которая примерно в два раза длиннее количества столбцов, которые должна иметь стандартная запись, а затем она отбрасывается с этой точки вперед. Мне нужно пропустить записи (данные между терминалами «,,,,»), которые имеют больше, чем правильное количество столбцов (15). Я понимаю, что это по существу пропускает 2 записи каждый раз, когда это происходит, но это прекрасно для того, что я делаю с довольно большим набором данных.MySQL Load Data InFile; skip rows IF

Я столкнулся с ключевым словом IGNORE, но это, похоже, не применимо. Я ищу что-то вроде: для каждой записи во время импорта пропустите запись, если record.columns.count> 15. Вот мой оператор импорта, спасибо за любую предоставленную помощь.

LOAD DATA LOCAL INFILE "/Users/foo/Desktop/csvData.csv" 
INTO TABLE csvData 
COLUMNS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
ESCAPED BY '"' 
LINES TERMINATED BY ',,,,'; 
+0

@Bill Karwin благодарит за добавление этого тега. –

ответ

0

Если вы просто хотите, чтобы пропустить искаженные записи, простая команда AWK для фильтрации только хорошие записей является:

awk -F, '{ if (NF == 15) print; }' csvData.csv > csvData_fixed.csv 

Тогда LOAD DATA из фиксированного файла.

Если вы хотите получить любитель, вы можете написать скрипт, используя awk (или Python или что угодно), чтобы переписать неверные записи в соответствующем формате.


Re ваш комментарий: Команда AWK читает исходный файл и выводит только в каждой строке, которая имеет ровно 15 полей, где поля разделены запятыми.

По-видимому, ваши входные данные не имеют линий, которые имеют ровно 15 полей, хотя вы описали их таким образом.


Еще одна мысль: это немного странно использовать строки терминатор «,,,,» в исходной команде LOAD DATA. Обычно терминатором линии является «\ n», который является символом новой строки. Поэтому, когда вы переопределяете терминатор строки как «,,,,», это означает, что MySQL будет читать текст до тех пор, пока не найдет «,,,,», даже если это закончит чтение десятков полей над несколькими строками текста. Возможно, вы можете установить терминатор линии на «,,,, \ n».

+0

По какой-то причине файл csvData_fixed.csv создан, но пуст. Я не знаком с командами awk, но я только начал изучать его, чтобы понять, могу ли я понять, что вы делаете. Вы решили изменить файл до того, как импорт будет работать нормально, я просто не знаю, как устранить проблему здесь. Спасибо –

+0

Спасибо за вашу помощь, я получил его работу, просто используя '\ n' в качестве ограничителя строки и не включая «,,,,». Слишком просто ... И вы были правы, никогда не было состояния NF == 15, потому что некоторые из полей включали строку вроде этого: «foo, bar». Запятая в середине была захвачена, хотя она должна была быть одной струной. Еще раз спасибо, я узнаю что-то новое каждый день! –

+0

Введенные запятые внутри строк с кавычками могли быть обработаны, если вы использовали функцию синтаксического анализа CSV и должны быть подходящие функции на любом языке сценариев. Во всяком случае, я рад предложению использовать новую линию, поскольку ваш терминатор линии работал! –

 Смежные вопросы

  • Нет связанных вопросов^_^