Как правильно указать на член структуры в C?

Как указывали другие ответы, было возможно указать столбцы для копирования в таблицу PG. Однако, без возможности ссылки на имена столбцов в CSV, это имело небольшую полезность, кроме загрузки в таблицу, где столбцы имели другой порядок.

К счастью, начиная с Postgres 9.3, можно копировать столбцы не только из файла или стандартного ввода, но также из команды оболочки с помощью PROGRAM:

PROGRAM

Команда для выполнения. В COPY FROM вход считывается из стандартного вывода команды, а в COPY TO вывод записывается на стандартный ввод команды.

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

Это был недостающий элемент, который нам нужен для такой долгожданной функции , Например, мы могли бы использовать эту опцию в сочетании с cut (в системе на базе UNIX) для выбора определенных столбцов по порядку:

COPY my_table (x2, x5, x7, x10) FROM PROGRAM 'cut -d "," -f 2,5,7,10 /path/to/file.csv' WITH (FORMAT CSV, HEADER)

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

Существует несколько других команд с открытым исходным кодом, которые лучше манипулируют CSV-файлами, такими как csvkit или miller. Вот пример использования miller для выбора столбцов по имени:

COPY my_table (x2, x5, x7, x10) FROM PROGRAM 'mlr --csv lf cut -f x2,x5,x7,x10 /path/to/file.csv' WITH (FORMAT CSV, HEADER)

3
задан user15 16 January 2019 в 15:09
поделиться

1 ответ

В Java это будет выглядеть как NullPointerException , вы не получаете такого рода ошибки в C, но это также связано с ответственностью. Отсылка нулевого указателя в C (как вы это сделали) может отвечать разными способами. Как уже было сказано в комментариях, вам нужно выделить указатель data.

complex *data = malloc(sizeof(complex));

И вам также следует освободить память, выделенную с помощью malloc, поэтому в конце кода перед возвратом состояния вашей программы в ОС (чего вы не сделали) вы должны сделать: [ 1112]

free(data);

Я не уверен в том, как работает ваш csvread, но он может не работать, используя не что иное, как массив сложных структур. Приведенный ниже код выделяет 10 комплексных чисел, инициализирующих их все, внутри функции csvread вам, возможно, придется внести некоторые изменения, чтобы перебрать их, поскольку вы показали, что с помощью простых объявлений массивов ваш код работает.

complex *data = calloc(10, sizeof(complex));

Приведенный выше код выделяет 10 сложных структур , и указатель указывает на первую выделенную. Чтобы перебрать их, вы можете индексировать их по номерам (например, data[0].real = 4) или использовать арифметику указателей. У меня есть сильное чувство, что вам придется изменить способ итерации по указателю data_out внутри функции csvread.

0
ответ дан ranu 16 January 2019 в 15:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: