Postgresql ошибка лишние данные после содержимого последнего столбца

ОШИБКА: дополнительные данные после последнего ожидаемого столбца в таблице postgres Я работаю над проектом, в котором мне нужно создать новую таблицу, а затем импортировать данные из CSV. Я прочитал много похожих вопросов («дополнительные данные после последнего ожидаемого столбца») и ответы на StackOverflow, но я все еще не нашел виновника. Таблица создана успешно с 19 […]

Содержание

  1. ОШИБКА: дополнительные данные после последнего ожидаемого столбца в таблице postgres
  2. «ОШИБКА: дополнительные данные после последнего ожидаемого столбца» при использовании PostgreSQL COPY
  3. 2 ответа
  4. Автоматизация
  5. ОШИБКА: дополнительные данные после последнего ожидаемого столбца в PostgreSQL, в то время как количество столбцов такое же
  6. «ОШИБКА: дополнительные данные после последнего ожидаемого столбца» при использовании PostgreSQL COPY
  7. 2 ответы
  8. автоматизация
  9. ОШИБКА: дополнительные данные после последнего ожидаемого столбца в таблице postgres

ОШИБКА: дополнительные данные после последнего ожидаемого столбца в таблице postgres

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

Таблица создана успешно с 19 различными столбцами. Затем я пытаюсь импортировать данные в новую таблицу.

И я получаю сообщение об ошибке. Я сделал следующее в CSV:

  • Убедитесь, что он сохранен как UTF-8 CSV (работает на Mac)
  • Уже вычистил все запятые в каждом ряду
  • Вычистил все значения NULL
  • Подтверждено, что все типы данных (целые, плавающие, текстовые и т. Д.) Верны
  • Я пытался просто скопировать только первый столбец, unitid ; это не удалось. Я попытался импортировать только второй столбец ( intsnm ), и он не удалось с той же ошибкой.

Полное сообщение об ошибке при попытке скопировать все 19 столбцов выглядит следующим образом:

Произошла ошибка при выполнении команды SQL: COPY colleges2014_15 (unitid, intsnm, город, stabbr, zip_clean, контроль, широта, долгота, tutionfee_in, tuitionfee_out, pctpell, inc_pct _.

ОШИБКА: дополнительные данные после последнего ожидаемого столбца Где: COPY colleges2014_15, строка 2: «100654, Alabama A & M University, Normal, AL, 35762,35762,1,34.783368, -86.568502,9096,16596,0,7356,0,651 . «1 заявление не удалось.

Время выполнения: 0,03 с

Полное сообщение об ошибке при попытке скопировать только первый столбец:

Произошла ошибка при выполнении команды SQL: COPY colleges2014_15 (unitid) FROM ‘/ Users / compose / Downloads / CollegeScorecard_Raw_Data x / MERGED2014_15_cleaned.csv’ CSV HEADER

ОШИБКА: дополнительные данные после последнего ожидаемого столбца Где: COPY colleges2014_15, строка 2: «100654, Alabama A & M University, Normal, AL, 35762,35762,1,34.783368, -86.568502,9096,16596,0,7356,0,651 . «1 заявление не удалось.

Источник

«ОШИБКА: дополнительные данные после последнего ожидаемого столбца» при использовании PostgreSQL COPY

Пожалуйста, подождите, это мой первый пост.

Я пытаюсь запустить команду COPY в PostgreSQL-9.2 для добавления таблицы с разделителями табуляции из файла .txt в базу данных PostgreSQL, например:

Я уже создал в базе данных пустую таблицу с именем «raw_data» с помощью команды SQL:

При попытке запустить команду COPY я получаю следующее сообщение об ошибке:

(Числа здесь должны быть заголовками столбцов)

Я не уверен, что это потому, что я не указывал столбцы таблицы при создании таблицы db, но я пытаюсь избежать необходимости вручную вводить 800 или столбцы.

Есть предложения, как это исправить?

Вот пример того, как выглядит файл .txt:

2 ответа

Пустой стол не годится. Вам нужна таблица, соответствующая структуре входных данных. Что-то вроде:

Вам не нужно объявлять tab как DELIMITER , поскольку это значение по умолчанию:

800 столбцов говорите? Такое количество столбцов обычно указывает на проблему с вашим дизайном. В любом случае, есть способы полуавтоматизировать скрипт CREATE TABLE .

Автоматизация

Предполагая упрощенные необработанные данные

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

Этот запрос создает скрипт CREATE TABLE :

Более общий и безопасный запрос:

Выполнить после проверки действительности — или выполнить динамически, если вы доверяете результату:

Затем INSERT данные с этим запросом:

Строка преобразуется в литерал строки, приводится к новому типу строки таблицы и разлагается с помощью (row).* .

Вы можете поместить все это в функцию plpgsql, но вам нужно будет защититься от SQL-инъекций. (Здесь, на SO, есть несколько связанных решений. Попробуйте поискать.

Источник

ОШИБКА: дополнительные данные после последнего ожидаемого столбца в PostgreSQL, в то время как количество столбцов такое же

Я новичок в PostgreSQL, и мне нужно импортировать набор файлов csv, но некоторые из них не были успешно импортированы. У меня возникла такая же ошибка с этими файлами: ОШИБКА: дополнительные данные после последнего ожидаемого столбца . Я изучил этот отчет об ошибке и узнал, что эти ошибки могут возникать из-за того, что количество столбцов в таблице не равно количеству столбцов в файле. Но я не думаю, что нахожусь в такой ситуации.

Например, я создаю такую ​​таблицу:

И затем я хочу скопировать файл csv:

Затем я получил ошибку:

ОШИБКА: дополнительные данные после последнего ожидаемого столбца КОНТЕКСТ: COPY cast_info, строка 8801: «612,207,2222077,1,» (сегменты «Homies» — «Tilt A Whirl» — «Мы не умираем» — «Залы иллюзий . »

Полная строка в этом CSV-файле выглядит следующим образом:

612,207,2222077,1, »(сегменты« Homies »-« Tilt A Whirl »-« Мы не умираем »-« Halls of Illusions »-« Chicken Huntin »-« Еще одна песня о любви »-« Сколько раз? ») — «Шары для боулинга» — «Народ» — «Поросенок» — «Хокус покус» — «Пойдем до конца» — «Настоящая подпольная малышка») / Полный клип (отрывки «Дук да фук вниз» — » Настоящий подпольный ребенок ») / Гай Горфей (сегмент« Грубая сделка ») / Sugar Bear (сегмент« Настоящий андеграундный ребенок »)», 2,1

Как видите, в таблице ровно 7 столбцов.

Странно то, что я обнаружил, что строки ошибок всех этих файлов содержат символы обратной косой черты и кавычки ( «). Кроме того, эти строки — не единственная строка, содержащая » в файлах. Интересно, почему эта ошибка не появляется в других строках. Из-за этого я не уверен, что это проблема.

После изменения этих строк (например, замены «или удаления содержимого, оставив запятые), появляются новые ошибки: ОШИБКА: недопустимый синтаксис ввода для строки 2 каждого файла. И ошибки возникают из-за того, что данные в последнем столбце этих строк были добавлены три точки с запятой (;;;) без всякой причины.Но когда я открываю эти CSV-файлы, я не вижу трех точек с запятой в этих строках.

Например, после удаления содержимого пятого столбца этой строки:

У меня ошибка:
ОШИБКА: недопустимый синтаксис ввода для целого типа: «1 ;;;» КОНТЕКСТ: КОПИРОВАТЬ cast_info, строка 2, столбец role_id: «1 ;;;»

Хотя строка 2 не содержит трех точек с запятой, а именно:

В принципе, я надеюсь, что проблема может быть решена без изменения самих данных. Спасибо за терпение и помощь!

Источник

«ОШИБКА: дополнительные данные после последнего ожидаемого столбца» при использовании PostgreSQL COPY

Пожалуйста, потерпите меня, так как это мой первый пост.

Я пытаюсь запустить КОПИЯ Команда в PostgreSQL-9.2 для добавления таблицы с разделителями табуляции из файла .txt в базу данных PostgreSQL, например:

Я уже создал в базе данных пустую таблицу с именем «raw_data» с помощью команды SQL:

Я продолжаю получать следующее сообщение об ошибке при попытке запустить COPY команда:

(Цифры здесь должны быть заголовками столбцов)

Я не уверен, что это потому, что я не указал столбцы таблицы при создании таблицы БД, но я пытаюсь избежать необходимости вручную вводить 800 или столбцы.

Любые предложения по устранению этого?

Вот пример того, как выглядит файл .txt:

задан 03 мая ’13, 21:05

+1, кстати. Добро пожаловать в Stackoverflow, очень хороший вопрос для первого поста. — Erwin Brandstetter

2 ответы

Пустой стол не годится. Вам нужна таблица, соответствующая структуре входных данных. Что-то типа:

Вам не нужно декларировать tab as DELIMITER так как это по умолчанию:

800 колонок говоришь? Такое количество столбцов обычно указывает на проблему с вашим дизайном. В любом случае, есть способы полуавтоматизировать CREATE TABLE скрипты.

автоматизация

Предполагая упрощенные необработанные данные

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

Этот запрос создает CREATE TABLE сценарий:

Более общий и безопасный запрос:

Выполнить после проверки правильности или выполнить динамически, если вы доверяете результату:

Затем INSERT данные с этим запросом:

Строка преобразуется в литерал строки, приводится к новому типу строки таблицы и разлагается с помощью (row).* .

Вы можете поместить все это в функцию plpgsql, но вам нужно защититься от SQL-инъекций. (Здесь на SO есть ряд связанных решений. Попробуйте выполнить поиск.

Источник

ОШИБКА: дополнительные данные после последнего ожидаемого столбца в таблице postgres

Я работаю над проектом, в котором мне нужно создать новую таблицу, а затем импортировать данные из CSV. Я читал много похожих вопросов («дополнительные данные после последнего ожидаемого столбца») и ответов на StackOverflow, но до сих пор не нашел виновника.

Таблица успешно создана с 19 различными столбцами. Затем я пытаюсь импортировать данные в новую таблицу.

И я получаю сообщение об ошибке. В CSV я сделал следующее:

  • Убедитесь, что он сохранен как UTF-8 CSV (работает на Mac)
  • Уже вычищены все запятые в каждой строке
  • Убраны все значения NULL
  • Подтверждено, что все типы данных (целые числа, числа с плавающей запятой, текст и т. Д.) Верны
  • Я пытался просто КОПИРОВАТЬ только первый столбец unitid ,; это не удалось. Я пробовал импортировать только второй столбец ( intsnm ), и это не удалось с той же ошибкой.

Полное сообщение об ошибке при попытке КОПИРОВАТЬ по всем 19 столбцам выглядит следующим образом:

An error occurred when executing the SQL command: COPY colleges2014_15( unitid, intsnm, city, stabbr, zip_clean, control, latitude, longitude, tutionfee_in, tuitionfee_out, pctpell, inc_pct_.

ERROR: extra data after last expected column Where: COPY colleges2014_15, line 2: «100654,Alabama A & M University,Normal,AL,35762,35762,1,34.783368,-86.568502,9096,16596,0.7356,0.651. » 1 statement failed.

Полное сообщение об ошибке при попытке скопировать только первый столбец:

An error occurred when executing the SQL command: COPY colleges2014_15( unitid ) FROM ‘/Users/compose/Downloads/CollegeScorecard_Raw_Data x/MERGED2014_15_cleaned.csv’ CSV HEADER

ERROR: extra data after last expected column Where: COPY colleges2014_15, line 2: «100654,Alabama A & M University,Normal,AL,35762,35762,1,34.783368,-86.568502,9096,16596,0.7356,0.651. » 1 statement failed.

Источник

M

I made a rather complicate answer with cte, should work but quite long
Method: use row number for getting the team play order (overall, home/away) and sum up
See if anyone can have more simple answer for that
WITH cte (id, match_date, team1_id, team2_id, score1, score2, team1_order, team2_order, home_order, away_order)
as
(
select t.id, match_date, team1_id, team2_id,
score1=case when score_team1 > score_team2 then 3 when score_team1 = score_team2 then 1 else 0 end,
score2=case when score_team1 < score_team2 then 3 when score_team1 = score_team2 then 1 else 0 end,
team1_order = p1.ord,
team2_order = p2.ord,
home_order, away_order
from @t t
join
(
select id, team,
ROW_NUMBER() OVER (PARTITION BY team order by match_date) ord
from
(select id, match_date, team1_id team from @t
union all
select id, match_date, team2_id team from @t) a
) p1 on p1.id=t.id and p1.team = team1_id
join
(
select id, team,
ROW_NUMBER() OVER (PARTITION BY team order by match_date) ord
from
(select id, match_date, team1_id team from @t
union all
select id, match_date, team2_id team from @t) a
) p2 on p2.id=t.id and p2.team = team2_id
join
(
select id,
ROW_NUMBER() OVER (PARTITION BY team1_id order by match_date) home_order,
ROW_NUMBER() OVER (PARTITION BY team2_id order by match_date) away_order
from @t
) p3 on p3.id=t.id
)
select c.id, c.match_date, c.team1_id, c.team2_id, score1, score2,
team1_prev=
(select isnull(sum(score1),0) from cte c11 where c11.team1_id = c.team1_id and c.team1_order — c11.team1_order between 1 and 5) +
(select isnull(sum(score2),0) from cte c12 where c12.team2_id = c.team1_id and c.team1_order — c12.team2_order between 1 and 5),
team2_prev=
(select isnull(sum(score1),0) from cte c21 where c21.team1_id = c.team2_id and c.team2_order — c21.team1_order between 1 and 5) +
(select isnull(sum(score2),0) from cte c22 where c22.team2_id = c.team2_id and c.team2_order — c22.team2_order between 1 and 5),
team1_prevhome=
(select isnull(sum(score1),0) from cte c3 where c3.team1_id = c.team1_id and c.home_order — c3.home_order between 1 and 5),
team2_prevaway=
(select isnull(sum(score2),0) from cte c4 where c4.team2_id = c.team2_id and c.away_order — c4.away_order between 1 and 5)
from cte c
order by id

BTW, @t is the original table since I use table variable for testing

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

CREATE TABLE colleges2014_15 (
unitid integer, 
intsnm text, 
city text, 
stabbr text, 
zip_clean char, 
control integer, 
latitude float, 
longitude float, 
tutionfee_in float, 
tuitionfee_out float, 
pctpell float,
inc_pct_lo float, 
dep_stat_pct_ind float, 
dep_debt_mdn float, 
ind_debt_mdn float, 
pell_debt_mdn float,
ugds_men float, 
ubds_women float, 
locale integer, 
PRIMARY KEY(unitid)
);

Таблица создана успешно с 19 различными столбцами. Затем я пытаюсь импортировать данные в новую таблицу.

COPY colleges2014_15(
unitid, 
intsnm, 
city, 
stabbr, 
zip_clean, 
control, 
latitude, 
longitude, 
tutionfee_in, 
tuitionfee_out, 
pctpell,
inc_pct_lo, 
dep_stat_pct_ind, 
dep_debt_mdn, 
ind_debt_mdn, 
pell_debt_mdn, 
ugds_men, 
ubds_women, 
locale
)
FROM '/Users/compose/Downloads/CollegeScorecard_Raw_Data x/MERGED2014_15_cleaned.csv' CSV HEADER
;

И я получаю сообщение об ошибке. Я сделал следующее в CSV:

  • Убедитесь, что он сохранен как UTF-8 CSV (работает на Mac)
  • Уже вычистил все запятые в каждом ряду
  • Вычистил все значения NULL
  • Подтверждено, что все типы данных (целые, плавающие, текстовые и т. Д.) Верны
  • Я пытался просто скопировать только первый столбец, unitid; это не удалось. Я попытался импортировать только второй столбец (intsnm), и он не удалось с той же ошибкой.

Полное сообщение об ошибке при попытке скопировать все 19 столбцов выглядит следующим образом:

Произошла ошибка при выполнении команды SQL: COPY colleges2014_15 (unitid, intsnm, город, stabbr, zip_clean, контроль, широта, долгота, tutionfee_in, tuitionfee_out, pctpell, inc_pct _…

ОШИБКА: дополнительные данные после последнего ожидаемого столбца Где: COPY colleges2014_15, строка 2: «100654, Alabama A & M University, Normal, AL, 35762,35762,1,34.783368, -86.568502,9096,16596,0,7356,0,651 … «1 заявление не удалось.

Время выполнения: 0,03 с

Полное сообщение об ошибке при попытке скопировать только первый столбец:

Произошла ошибка при выполнении команды SQL: COPY colleges2014_15 (unitid) FROM ‘/ Users / compose / Downloads / CollegeScorecard_Raw_Data x / MERGED2014_15_cleaned.csv’ CSV HEADER

ОШИБКА: дополнительные данные после последнего ожидаемого столбца Где: COPY colleges2014_15, строка 2: «100654, Alabama A & M University, Normal, AL, 35762,35762,1,34.783368, -86.568502,9096,16596,0,7356,0,651 … «1 заявление не удалось.

Время выполнения: 0,01 с

Огромная благодарность за любую помощь.

Мне потребовалось некоторое время, чтобы выяснить, что было неправильно при поиске ошибки, поэтому разместил мою проблему, чтобы помочь другим. Моя проблема заключалась в неопытности с pgAdmin, так как pgAdmin требует, чтобы таблица создавалась в столбцах WITH до импорта данных. Я ожидал, что заголовки будут использоваться из файла .csv, большинство других пакетов, которые я использовал, работали таким образом.

Если вы работаете с ГИС-системой, использующей PostGIS, есть простое решение. Я использую QGIS 3.4, с установленными Postgres и PostGIS.

В QGIS
Выберите пункт меню «База данных»
Выберите DBManager
Слева — выберите место для стола Выберите Импорт слоя / файла В следующем окне выберите следующее
Ввод — выберите файл
Таблица — введите имя таблицы
хорошо

после запроса COPY objrts FROM 'C:objrt00100.unl' (DELIMITER '|');
не знаю как бороться
ОШИБКА: лишние данные после содержимого последнего столбца
CONTEXT: COPY objrts, строка 1: "11955|13124|I||93|0,0|0,0|0|0,0|0,0|0,0|0,0|0,0|0|0|2013-04-08 00:00:00|||"

задан 19 сен 2016 в 9:42

DiSayThis's user avatar

DiSayThisDiSayThis

472 серебряных знака9 бронзовых знаков

1

1 ответ

Без структуры objrts точно ответ дать не получится, но вероятнее всего у вас в строке слишком много элементов. Попробуйте убрать несколько разделителей с конца.

ответ дан 19 сен 2016 в 11:15

Alexey Prokopenko's user avatar

An empty table won’t do. You need table that matches the structure of input data. Something like:

CREATE TABLE raw_data (
  col1 int
, col2 int
  ...
);

You don’t need to declare tab as DELIMITER since that’s the default:

COPY raw_data FROM '/home/Projects/TestData/raw_data.txt';

800 columns you say? That many columns would typically indicate a problem with your design. Anyway, there are ways to half-automate the CREATE TABLE script.

Automation

Assuming simplified raw data

1   2   3   4  -- first row contains "column names"
1   1   0   1  -- tab separated
1   0   0   1
1   0   1   1

Define a different DELIMITER (one that does not occur in the import data at all), and import to a temporary staging table with a single text column:

CREATE TEMP TABLE tmp_data (raw text);

COPY tmp_data FROM '/home/Projects/TestData/raw_data.txt' WITH (DELIMITER '§');

This query creates the CREATE TABLE script:

SELECT 'CREATE TABLE tbl (col' || replace (raw, E't', ' bool, col') || ' bool)'
FROM   (SELECT raw FROM tmp_data LIMIT 1) t;

A more generic & safer query:

SELECT 'CREATE TABLE tbl('
    ||  string_agg(quote_ident('col' || col), ' bool, ' ORDER  BY ord)
    || ' bool);'
FROM  (SELECT raw FROM tmp_data LIMIT 1) t
     , unnest(string_to_array(t.raw, E't')) WITH ORDINALITY c(col, ord);

Returns:

CREATE TABLE tbl (col1 bool, col2 bool, col3 bool, col4 bool);

Execute after verifying validity — or execute dynamically if you trust the result:

DO
$$BEGIN
EXECUTE (
   SELECT 'CREATE TABLE tbl (col' || replace(raw, ' ', ' bool, col') || ' bool)'
   FROM  (SELECT raw FROM tmp_data LIMIT 1) t
   );
END$$;

Then INSERT the data with this query:

INSERT INTO tbl
SELECT (('(' || replace(replace(replace(
                  raw
                , '1',   't')
                , '0',   'f')
                , E't', ',')
             || ')')::tbl).*
FROM   (SELECT raw FROM tmp_data OFFSET 1) t;

Or simpler with translate():

INSERT INTO tbl
SELECT (('(' || translate(raw, E'10t', 'tf,') || ')')::tbl).*
FROM   (SELECT raw FROM tmp_data OFFSET 1) t;

The string is converted into a row literal, cast to the newly created table row type and decomposed with (row).*.

All done.

You could put all of that into a plpgsql function, but you’d need to safeguard against SQL injection. (There are a number of related solutions here on SO. Try a search.

db<>fiddle here
Old SQL Fiddle

An empty table won’t do. You need table that matches the structure of input data. Something like:

CREATE TABLE raw_data (
  col1 int
, col2 int
  ...
);

You don’t need to declare tab as DELIMITER since that’s the default:

COPY raw_data FROM '/home/Projects/TestData/raw_data.txt';

800 columns you say? That many columns would typically indicate a problem with your design. Anyway, there are ways to half-automate the CREATE TABLE script.

Automation

Assuming simplified raw data

1   2   3   4  -- first row contains "column names"
1   1   0   1  -- tab separated
1   0   0   1
1   0   1   1

Define a different DELIMITER (one that does not occur in the import data at all), and import to a temporary staging table with a single text column:

CREATE TEMP TABLE tmp_data (raw text);

COPY tmp_data FROM '/home/Projects/TestData/raw_data.txt' WITH (DELIMITER '§');

This query creates the CREATE TABLE script:

SELECT 'CREATE TABLE tbl (col' || replace (raw, E't', ' bool, col') || ' bool)'
FROM   (SELECT raw FROM tmp_data LIMIT 1) t;

A more generic & safer query:

SELECT 'CREATE TABLE tbl('
    ||  string_agg(quote_ident('col' || col), ' bool, ' ORDER  BY ord)
    || ' bool);'
FROM  (SELECT raw FROM tmp_data LIMIT 1) t
     , unnest(string_to_array(t.raw, E't')) WITH ORDINALITY c(col, ord);

Returns:

CREATE TABLE tbl (col1 bool, col2 bool, col3 bool, col4 bool);

Execute after verifying validity — or execute dynamically if you trust the result:

DO
$$BEGIN
EXECUTE (
   SELECT 'CREATE TABLE tbl (col' || replace(raw, ' ', ' bool, col') || ' bool)'
   FROM  (SELECT raw FROM tmp_data LIMIT 1) t
   );
END$$;

Then INSERT the data with this query:

INSERT INTO tbl
SELECT (('(' || replace(replace(replace(
                  raw
                , '1',   't')
                , '0',   'f')
                , E't', ',')
             || ')')::tbl).*
FROM   (SELECT raw FROM tmp_data OFFSET 1) t;

Or simpler with translate():

INSERT INTO tbl
SELECT (('(' || translate(raw, E'10t', 'tf,') || ')')::tbl).*
FROM   (SELECT raw FROM tmp_data OFFSET 1) t;

The string is converted into a row literal, cast to the newly created table row type and decomposed with (row).*.

All done.

You could put all of that into a plpgsql function, but you’d need to safeguard against SQL injection. (There are a number of related solutions here on SO. Try a search.

db<>fiddle here
Old SQL Fiddle

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

CREATE TABLE colleges2014_15 (
unitid integer, 
intsnm text, 
city text, 
stabbr text, 
zip_clean char, 
control integer, 
latitude float, 
longitude float, 
tutionfee_in float, 
tuitionfee_out float, 
pctpell float,
inc_pct_lo float, 
dep_stat_pct_ind float, 
dep_debt_mdn float, 
ind_debt_mdn float, 
pell_debt_mdn float,
ugds_men float, 
ubds_women float, 
locale integer, 
PRIMARY KEY(unitid)
);

Таблица создана успешно с 19 различными столбцами. Затем я пытаюсь импортировать данные в новую таблицу.

COPY colleges2014_15(
unitid, 
intsnm, 
city, 
stabbr, 
zip_clean, 
control, 
latitude, 
longitude, 
tutionfee_in, 
tuitionfee_out, 
pctpell,
inc_pct_lo, 
dep_stat_pct_ind, 
dep_debt_mdn, 
ind_debt_mdn, 
pell_debt_mdn, 
ugds_men, 
ubds_women, 
locale
)
FROM '/Users/compose/Downloads/CollegeScorecard_Raw_Data x/MERGED2014_15_cleaned.csv' CSV HEADER
;

И я получаю сообщение об ошибке. Я сделал следующее в CSV:

  • Убедитесь, что он сохранен как UTF-8 CSV (работает на Mac)
  • Уже вычистил все запятые в каждом ряду
  • Вычистил все значения NULL
  • Подтверждено, что все типы данных (целые, плавающие, текстовые и т. Д.) Верны
  • Я пытался просто скопировать только первый столбец, unitid; это не удалось. Я попытался импортировать только второй столбец (intsnm), и он не удалось с той же ошибкой.

Полное сообщение об ошибке при попытке скопировать все 19 столбцов выглядит следующим образом:

Произошла ошибка при выполнении команды SQL: COPY colleges2014_15 (unitid, intsnm, город, stabbr, zip_clean, контроль, широта, долгота, tutionfee_in, tuitionfee_out, pctpell, inc_pct _…

ОШИБКА: дополнительные данные после последнего ожидаемого столбца Где: COPY colleges2014_15, строка 2: «100654, Alabama A & M University, Normal, AL, 35762,35762,1,34.783368, -86.568502,9096,16596,0,7356,0,651 … «1 заявление не удалось.

Время выполнения: 0,03 с

Полное сообщение об ошибке при попытке скопировать только первый столбец:

Произошла ошибка при выполнении команды SQL: COPY colleges2014_15 (unitid) FROM ‘/ Users / compose / Downloads / CollegeScorecard_Raw_Data x / MERGED2014_15_cleaned.csv’ CSV HEADER

ОШИБКА: дополнительные данные после последнего ожидаемого столбца Где: COPY colleges2014_15, строка 2: «100654, Alabama A & M University, Normal, AL, 35762,35762,1,34.783368, -86.568502,9096,16596,0,7356,0,651 … «1 заявление не удалось.

Время выполнения: 0,01 с

Огромная благодарность за любую помощь.

Мне потребовалось некоторое время, чтобы выяснить, что было неправильно при поиске ошибки, поэтому разместил мою проблему, чтобы помочь другим. Моя проблема заключалась в неопытности с pgAdmin, так как pgAdmin требует, чтобы таблица создавалась в столбцах WITH до импорта данных. Я ожидал, что заголовки будут использоваться из файла .csv, большинство других пакетов, которые я использовал, работали таким образом.

Если вы работаете с ГИС-системой, использующей PostGIS, есть простое решение. Я использую QGIS 3.4, с установленными Postgres и PostGIS.

В QGIS
Выберите пункт меню «База данных»
Выберите DBManager
Слева — выберите место для стола Выберите Импорт слоя / файла В следующем окне выберите следующее
Ввод — выберите файл
Таблица — введите имя таблицы
хорошо

emmalee

A reproducible exampleAlthough the OP has not provided an example of the JSON response, I have been able to find one in the https://coinmarketcap.com/api/documentation/v1/#operation/getV1CryptocurrencyListingsLatest you’re trying to consult. I reproduce below an example of that JSON so that the answer is reproducible. But I hit him as a single line so he doesn’t take too much.json_response = ‘{«data»: [{«id»: 1,»name»: «Bitcoin»,»symbol»: «BTC»,»slug»: «bitcoin»,»cmc_rank»: 5,»num_market_pairs»: 500,»circulating_supply»: 16950100,»total_supply»: 16950100,»max_supply»: 21000000,»last_updated»: «2018-06-02T22:51:28.209Z»,»date_added»: «2013-04-28T00:00:00.000Z»,»tags»: [«mineable»],»platform»: null,»quote»: {«USD»: {«price»: 9283.92,»volume_24h»: 7155680000,»volume_change_24h»: -0.152774,»percent_change_1h»: -0.152774,»percent_change_24h»: 0.518894,»percent_change_7d»: 0.986573,»market_cap»: 852164659250.2758,»market_cap_dominance»: 51,»fully_diluted_market_cap»: 952835089431.14,»last_updated»: «2018-08-09T22:53:32.000Z»},»BTC»: {«price»: 1,»volume_24h»: 772012,»volume_change_24h»: 0,»percent_change_1h»: 0,»percent_change_24h»: 0,»percent_change_7d»: 0,»market_cap»: 17024600,»market_cap_dominance»: 12,»fully_diluted_market_cap»: 952835089431.14,»last_updated»: «2018-08-09T22:53:32.000Z»}}},{«id»: 1027,»name»: «Ethereum»,»symbol»: «ETH»,»slug»: «ethereum»,»num_market_pairs»: 6360,»circulating_supply»: 16950100,»total_supply»: 16950100,»max_supply»: 21000000,»last_updated»: «2018-06-02T22:51:28.209Z»,»date_added»: «2013-04-28T00:00:00.000Z»,»tags»: [«mineable»],»platform»: null,»quote»: {«USD»: {«price»: 1283.92,»volume_24h»: 7155680000,»volume_change_24h»: -0.152774,»percent_change_1h»: -0.152774,»percent_change_24h»: 0.518894,»percent_change_7d»: 0.986573,»market_cap»: 158055024432,»market_cap_dominance»: 51,»fully_diluted_market_cap»: 952835089431.14,»last_updated»: «2018-08-09T22:53:32.000Z»},»ETH»: {«price»: 1,»volume_24h»: 772012,»volume_change_24h»: -0.152774,»percent_change_1h»: 0,»percent_change_24h»: 0,»percent_change_7d»: 0,»market_cap»: 17024600,»market_cap_dominance»: 12,»fully_diluted_market_cap»: 952835089431.14,»last_updated»: «2018-08-09T22:53:32.000Z»}}}],»status»: {«timestamp»: «2018-06-02T22:51:28.209Z»,»error_code»: 0,»error_message»: «»,»elapsed»: 10,»credit_count»: 1}}’
Suppose this JSON has been received in response to a request requests. Instead of that request, for the answer to be reproducible, I will use json.loads() to load the previous string in a Python dictionary:import json
data = json.loads(json_response)
From here you can reproduce the problem posed by the OP, which is basically that if you try to convert these data into a dataframe like this:coins=data[‘data’]
m=pd.DataFrame(coins)
z=m[[‘symbol’,’quote’]]
Or maybe. z a dataframe containing nesting dictionaries within a column: symbol quote
0 BTC {‘USD’: {‘price’: 9283.92, ‘volume_24h’: 71556…
1 ETH {‘USD’: {‘price’: 1283.92, ‘volume_24h’: 71556…
A solutionIf the dataframe is created in this other way:m = pd.json_normalize(data[«data»])
the result is that all internal dictionaries «dispack» giving rise to a multitude of new columns: id name … quote.ETH.fully_diluted_market_cap quote.ETH.last_updated
0 1 Bitcoin … NaN NaN
1 1027 Ethereum … 9.528351e+11 2018-08-09T22:53:32.000Z
Specifically, for example, column names like quote.USD.price which contains the price converted to USD, or quote.USD.percent_change_1hetc. These were code names in subdivisionaries.We can extract only the columns of interest, and rename them. For example:x = m[[«symbol», «quote.USD.price», «quote.USD.percent_change_1h»]]
x.columns=[«symbol», «price», «percent_change_1h»]
and x We’d already have the dataframe with the: symbol price percent_change_1h
0 BTC 9283.92 -0.152774
1 ETH 1283.92 -0.152774

Понравилась статья? Поделить с друзьями:
  • Postgresql ошибка 42601
  • Postgresql обработка ошибок
  • Postgresql как изменить формат даты
  • Postgresql как изменить расположение базы данных
  • Postgresql как изменить порт подключения