Содержание
- ОШИБКА: дополнительные данные после последнего ожидаемого столбца в таблице postgres
- «ОШИБКА: дополнительные данные после последнего ожидаемого столбца» при использовании PostgreSQL COPY
- 2 ответа
- Автоматизация
- ОШИБКА: дополнительные данные после последнего ожидаемого столбца в PostgreSQL, в то время как количество столбцов такое же
- «ОШИБКА: дополнительные данные после последнего ожидаемого столбца» при использовании PostgreSQL COPY
- 2 ответы
- автоматизация
- ОШИБКА: дополнительные данные после последнего ожидаемого столбца в таблице 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
DiSayThisDiSayThis
472 серебряных знака9 бронзовых знаков
1
1 ответ
Без структуры objrts точно ответ дать не получится, но вероятнее всего у вас в строке слишком много элементов. Попробуйте убрать несколько разделителей с конца.
ответ дан 19 сен 2016 в 11:15
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
Слева — выберите место для стола Выберите Импорт слоя / файла В следующем окне выберите следующее
Ввод — выберите файл
Таблица — введите имя таблицы
хорошо
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