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

после запроса 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

Импортирую фай 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

  • 549 просмотров

Студворк — интернет-сервис помощи студентам

Добрый день! Импортирую фай 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 делал данные операции на работе и имею только скриншоты ошибок, поэтому прописывал все вручную, скрины не могу приложить или копипаст всего кода, но в общем описал всю проблему

S

the output I get is: [1, 0, 3, 0]Why did you give that exit?At the time of creating the object where the whole arrangement will be:int[] rangoResultado = new
int[cantidadElementosNuevoArray];
The settlement is initialized 0, this means every element of the arrangement, its default value will be 0.However, the real problem is in this condition:rangoResultado.length — 1
In which you will only execute iterations 0 a 2 (due to the size of the arrangement rangoResultado That’s it. 4like you rubbed him -1, will result 3, therefore the variable i You can only take those values. Then we know why he gave us the result. [1,0,3,0] and this is because you are only taking into account these three indices: 0,1,2. The last element of the settlement rangoResultado will have a value 0 stored, because the loop only makes iterations of 0 a 2.There is also another error and it is in this condition:i% 2 == 0
You’re evaluating if the value you have i is even, when it should actually be detected if the element of the arrangement numeros It’s odd.The condition should be this way:numeros[i] % 2 != 0
If the residue of the number is 1It’s because it’s odd.Solution to the problem: You need to create a variable called posin which we will keep the position of the arrangement rangoResultado and this is because we cannot use the variable i settlement rangoResultadoas we would be overflowing with the arrangement and give an exception.I mean, if we did this:int[] numeros = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int cantidadElementosNuevoArray = 4;
int[] rangoResultado = new int[cantidadElementosNuevoArray];
for (int i = 0; i < numeros.length; i++)
{
if (numeros[i] % 2 != 0)
rangoResultado[i] = numeros[i];
} System.out.println(Arrays.toString(rangoResultado));
I’d give the exception. ArrayIndexOutOfBounds, because, the maximum index you may have rangoResultado That’s it. 3.So, the solution is to use another variable, in which it increases every time it is detected if an element of the arrangement numeros It’s odd.Complete Solution:public class Program
{
public static void main(String[] args)
{
int pos = 0;
int[] numeros = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int cantidadElementosNuevoArray = 4;

int[] rangoResultado = new int[cantidadElementosNuevoArray];
for (int i = 0; i &lt; numeros.length; i++)
{
if (numeros[i] % 2 != 0)
{
rangoResultado[pos] = numeros[i];
++pos;
}
}
System.out.println(Arrays.toString(rangoResultado));
}

}

Я пытаюсь импортировать CSV-файл в postgres и получаю следующую ошибку:

"C:\Program Files\PostgreSQL\11\bin\psql.exe" --command " "\copy public.prisons (english_prison_names, dari_prison_names, pashto_prison_names, characters_transmitted) FROM 'C:/Data/prisons.csv' CSV ENCODING 'UTF8' QUOTE '"' ESCAPE '''';""

ERROR: extra data after last expected column CONTEXT: COPY prisons,
line 1: «Badakhshan Prison Facility,زن دان ب دخ شان,ب د د خشا هناخ
یدنب ن,BKN,,,…»

Я уже прочитал несколько таких вопросов в стеке и проверил, нет ли лишних пробелов в данных, и у меня только 4 столбца в моем CSV-файле, 4 столбца созданы в моей таблице.

образец первых нескольких строк CSV, вроде уже на первой строке завис?

Badakhshan Prison Facility,زن دان ب دخ شان,ب د د خشا هناخ یدنب ن,BKN,,,,,,
Badghis Prison Facility,نز دا ب ن ا د سیغ,ب د ا د ب سیغ ن د ی هناخ,BDG,,,,,,
Baghlan Prison Facility,نز دا ب ن غا ل ن,ب د غا ل ب ن ن د ی هناخ,BGL,,,,,,

Заранее благодарю за любую помощь

Понравилась статья? Поделить с друзьями:
  • Postgres ошибка роль не существует
  • Postgres ошибка role does not exist
  • Postgre ошибка при создании информационной базы
  • Postfix ошибка relay access denied
  • Postfix ошибка 451 temporary lookup failure