Как импортировать большой файл .csv (~2 ГБ) в таблицу PostgreSQL

Я новичок в базах данных и PostgreSQL, и сегодня я хотел импортировать этот набор данных: https://www.kaggle.com/datasets/wilmerarltstrmberg/recipe-dataset-over-2m/data в PostgreSQL, чтобы я мог сделать Приложение для поиска рецептов.

Я начал с создания новой базы данных, затем таблицы, а затем создания точных столбцов из набора данных:

create table recipes_table (
title text,
    ingredients text,
    directions text,
    link text,
    source text,
    NER text,
    site text
);

Затем я приступил к импорту всех данных из моего .csv (щелкнув правой кнопкой мыши по таблице и выбрав «Импорт»). Я оставил все по умолчанию и начал импортировать, но через 10 секунд всегда получаю ошибки.

К сожалению, я потерял учет всех изменений, которые я внес в свой код и таблицу (их было много), но я оставлю результаты, которые я получил на вкладке процессов:

--command " "\\copy public.recipes_table (title, ingredients, directions, link, source, \"NER\", site) FROM 'C:/Users/silvi/Desktop/WEBPRO~1/archive/RECIPE~1.CSV' DELIMITER ',' CSV HEADER QUOTE '\"' ESCAPE '''';""

ОШИБКА: в данных обнаружена новая строка без кавычек
СОВЕТ: используйте поле CSV в кавычках для обозначения новой строки.
КОНТЕКСТ: КОПИРОВАТЬ таблицу рецептов, строка 1274879` — первая итерация; Я открыл свой терминал в VS Code и сделал это, чтобы решить эту проблему: sed -i 's/\r//g' рецепты_данных.csv

И затем с помощью этой команды:

--command " "\\copy public.recipes_table (title, ingredients, directions, link, source, \"NER\", site) FROM 'C:/Users/silvi/Desktop/WEBPRO~1/archive/RECIPE~1.CSV' DELIMITER ',' CSV HEADER QUOTE '\"' ESCAPE '''';""

Я получил эту ошибку

ОШИБКА: дополнительные данные после последнего ожидаемого столбца
КОНТЕКСТ: КОПИРОВАТЬ таблицу рецептов, строка 1274879: "Соус для спагетти", [""1-2 фунта гамбургера"", "1-2 фунта итальянской колбасы"", ""2 зубчика чеснока"", ""соль"" , ..."`

Или вот такой:

ОШИБКА: дополнительные данные после последнего ожидаемого столбца
КОНТЕКСТ: КОПИРОВАТЬ таблицу рецептов, строка 2: «Ореховое печенье без выпечки»,[»»1 c. плотно упакованный коричневый сахар"", ""1/2 стакана. сгущенное молоко", ""1/2 ч. л. фургон..."`

Теперь я в замешательстве настолько, насколько это возможно. Как я могу импортировать эту таблицу в свое приложение pgAdmin, чтобы визуализировать ее и использовать в своем проекте?

Более того, мне не нужны все столбцы из этого .csv, так как я могу получить, например, только название, ингредиенты, направления и NER?

К вашему сведению: пожалуйста, не делайте ссылок на изображения. Простой текст ошибки — это хорошо. Это по двум причинам. 1.) Люди опасаются переходить по случайным ссылкам. 2.) Если ошибка представлена ​​в виде обычного текста, ее можно найти в других источниках, столкнувшихся с такой же проблемой.

Error_2646 23.07.2024 19:38

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

JNevill 23.07.2024 19:45

@JNeville Я обновил сообщение, извините, я тоже новичок в публикации на Stackoverflow. Возможно, теперь у вас есть больше полезной информации

Silviu250 23.07.2024 19:48

@Error_2646 Извините, я изменил это. Я не знал, что это будет опубликовано в виде ссылки. Надеюсь, вы проголосуете за это сейчас =)

Silviu250 23.07.2024 19:49
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Глядя на ваш код ошибки, он показывает ESCAPE '''', и я подозреваю, что это является причиной проблемы (включая ту, которую вы заклеили командой sed).

Первые две строки этого файла:

title,ingredients,directions,link,source,NER,site
No-Bake Nut Cookies,"[""1 c. firmly packed brown sugar"", ""1/2 c. evaporated milk"", ""1/2 tsp. vanilla"", ""1/2 c. broken nuts (pecans)"", ""2 Tbsp. butter or margarine"", ""3 1/2 c. bite size shredded rice biscuits""]","[""In a heavy 2-quart saucepan, mix brown sugar, nuts, evaporated milk and butter or margarine."", ""Stir over medium heat until mixture bubbles all over top."", ""Boil and stir 5 minutes more. Take off heat."", ""Stir in vanilla and cereal; mix well."", ""Using 2 teaspoons, drop and shape into 30 clusters on wax paper."", ""Let stand until firm, about 30 minutes.""]",www.cookbooks.com/Recipe-Details.aspx?id=44874,Gathered,"[""bite size shredded rice biscuits"", ""vanilla"", ""brown sugar"", ""nuts"", ""milk"", ""butter""]",www.cookbooks.com

Столбец ingredients заключен в двойные кавычки ", ОДНАКО внутри данных также есть символы двойных кавычек, поэтому они экранируются этими двойными кавычками с помощью второй двойной кавычки.

Простой пример того, как это выглядит: представьте, что ваши данные — это Hi, they call me "Joe", в этих данных они будут инкапсулированы в двойные кавычки, а уже существующие двойные кавычки будут удвоены, чтобы указать, что они являются частью данных, поэтому:

 "Hi, they call me ""Joe"""

Следовательно, ваш ESCAPE персонаж " не '.

Я бы загрузил файл еще раз, чтобы у вас была новая копия, которая была подделана sed, и все установил бы так же, но изменил бы символ ESCAPE на " и повторно запустил импорт. Это изменит запуск командной строки на ESCAPE '\"'

Возможно, вам будет полезно прочитать документацию по команде postgres COPY, чтобы понять все параметры. Даже если вы используете пользовательский интерфейс для настройки, эта команда COPY выполняется «под капотом»: https://www.postgresql.org/docs/current/sql-copy.html

Наконец, столбцы ingredient, directions и NER выглядят как массивы JSON, поэтому вы можете подумать о том, как это повлияет на вашу схему и приложение, и обращаться с ними соответствующим образом (не как с текстом).

Спасибо! Я помню, как изменил символ Escape на ", но теперь, глядя на команду, это: ESCAPE '\"';"" Так что я не знаю, правильно ли она применилась. В любом случае, я решил эту проблему с помощью инструмента запросов и, очевидно, изменив настройки безопасности файла .csv. Я думаю, что ваше решение тоже должно сработать.

Silviu250 23.07.2024 22:26
Ответ принят как подходящий
    create table recipes_table (
title text,
    ingredients text,
    directions text,
    link text,
    source text,
    NER text,
    site text
);

Затем:

copy recipes_table(title, ingredients, directions, link, source, NER, site)
    from  'C:/Users/silvi/Desktop/WEBPRO~1/archive/RECIPE~1.CSV' CSV HEADER;

PS: Я скачал и протестировал то же самое:

2 231 142 строки затронуты за 26 с 752 мс

Привет! Большое спасибо! Я решил это с вашей помощью. У меня возникла ошибка разрешения на чтение, но для всех, у кого возникла эта проблема, мне помогло: stackoverflow.com/questions/54031813/…

Silviu250 23.07.2024 22:30

@ Silviu250\ о, я дал это разрешение и не думал, что это будет проблемой.

Cetin Basoz 23.07.2024 22:37

Другие вопросы по теме