после запроса 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|||"
- sql
- postgresql
- запрос
задан 19 сен 2016 в 9:42
DiSayThisDiSayThis
472 серебряных знака9 бронзовых знаков
1
-
Посчитайте количество столбцов и количество делимитеров. Возможно, стоит NULL написать между пустыми ||.
19 сен 2016 в 10:48
1 ответ
Без структуры objrts точно ответ дать не получится, но вероятнее всего у вас в строке слишком много элементов. Попробуйте убрать несколько разделителей с конца.
ответ дан 19 сен 2016 в 11:15
I am working on a project where I need to create a new table, then import data from a CSV. I’ve read many similar questions («extra data after last expected column») and answers on StackOverflow, but I still haven’t found the culprit.
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)
);
The table is created successfully with the 19 different columns. Then I go try to import the data into the new table.
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
;
And I get the error message. I’ve done the following in the CSV:
- Made sure it’s saved as UTF-8 CSV (working on a Mac)
- Already cleaned out all commas in every row
- Cleaned out all NULL values
- Confirmed that all the data types (integer, float, text, etc.) are correct
- I’ve tried to simply COPY only the first column,
unitid
; it failed. I’ve tried importing only the second column (intsnm
) and it failed with the same error.
The full error message when trying to COPY over all 19 columns is as follows:
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.Execution time: 0.03s
The full error message when trying to copy simply the first column only is:
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 HEADERERROR: 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.Execution time: 0.01s
Hugely appreciate any help.
после запроса 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
Импортирую фай excel в котором 169 столбцов. Excel перевел в csv для импорта, в самой СУБД создал таблицу, обозначил все наименования столбцов и тип данных.
Далее происходят постоянные ошибки, изначально пробовал импортировать через pgadmin панель «import/export файлов» вылазила ошибка «неверная последовательно байт для кодировки UTF-8» через тот же pgadmin пробовал менять кодировку на latin1 и win1251(все столбцы названы на английском языке и имею подобный вид gas_commercial1(в самой таблице
в одном столбце есть текст на русском языке(1 слово в строке), 1 столбец с типом дата, все остальные 167 столбцов с типом numeric ) — выдает ошибку: «лишние данные после содержимого последнего столбца» хотя на 10 раз проверял, ничего там нет, только 1 таблица на листе.
Далее сделал попытку использовать SQL запрос
Copy chp1 from ‘C:usersdesctopchp1.csv’ — вылазит ошибка: не удалось открыть файл для чтения(пробовал менять местоположение — все тоже самое)
И последняя моя попытка была через plsql панель
Copy chp1 from ‘C:usersdesctopchp1.csv’ delimeter ‘,’ csv header — вылазит ошибка «нет данных для столбце date: КОНТЕКСТ copy chp1 строка 2: «чтэц-1, 2022-10-01(01.10.2022 тоже пробовал), 1.1, 2.15, 3.18 ……» Т.е каждый раз какие-то разные ошибки, подскажите пожалуйста, что я делаю не так..
P.S делал данные операции на работе и имею только скриншоты ошибок, поэтому прописывал все вручную, скрины не могу приложить или копипаст всего кода, но в общем описал всю проблему
-
Вопрос задан08 окт. 2022
-
542 просмотра
Добрый день! Импортирую фай excel в котором 169 столбцов. Excel перевел в csv для импорта, в самой СУБД создал таблицу, обозначил все наименования столбцов и тип данных.
Далее происходят постоянные ошибки, изначально пробовал импортировать через pgadmin панель «import/export файлов» вылазила ошибка «неверная последовательно байт для кодировки UTF-8» через тот же pgadmin пробовал менять кодировку на latin1 и win1251(все столбцы названы на английском языке и имею подобный вид gas_commercial1(в самой таблице
в одном столбце есть текст на русском языке(1 слово в строке), 1 столбец с типом дата, все остальные 167 столбцов с типом numeric ) — выдает ошибку: «лишние данные после содержимого последнего столбца» хотя на 10 раз проверял, ничего там нет, только 1 таблица на листе.
Далее сделал попытку использовать SQL запрос
Copy chp1 from ‘C:usersdesctopchp1.csv’ — вылазит ошибка: не удалось открыть файл для чтения(пробовал менять местоположение — все тоже самое)
И последняя моя попытка была через plsql панель
Copy chp1 from ‘C:usersdesctopchp1.csv’ delimeter ‘,’ csv header — вылазит ошибка «нет данных для столбце date: КОНТЕКСТ copy chp1 строка 2: «чтэц-1, 2022-10-01(01.10.2022 тоже пробовал), 1.1, 2.15, 3.18 ……» Т.е каждый раз какие-то разные ошибки, подскажите пожалуйста, что я делаю не так..
P.S делал данные операции на работе и имею только скриншоты ошибок, поэтому прописывал все вручную, скрины не могу приложить или копипаст всего кода, но в общем описал всю проблему