Проблема с файлом CSV. Синтаксическая ошибка в или около "," (PG :: SyntaxError) - PullRequest
0 голосов
/ 29 января 2020

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

phone_number,start_time,session_time,client_status,operator_status,custom_status,sip and so on...
42424242, 2019-12-09 14:01:17, , CANCEL, , , , 1, 0, some name, 2222222, info, info, 242424, , 0, 

Это мой ruby скрипт.

require 'csv'
require 'pg'

host = "localhost"
port = 5432
database = "testdb"
username = "XXX"
password = "XXX"

pg_conn = PG.connect(host,port,"","",database,username,password)
puts pg_conn

csv_text = File.read('/home/XXX/XXX/XXX/calls.csv')
csv = CSV.parse(csv_text, :headers => true, :encoding => 'ISO-8859-1', :col_sep => ',')

csv.each do |row|
  pg_conn.exec("INSERT INTO testing(custom_field_2, phone_number, client_status, operator_status, start_time, sip)
                VALUES (#{row['custom_field_2']},#{row['phone_number']},#{row['client_status']},#{row['operator_status']},#{row['start_time']},#{row['sip']})")
end

Когда я пытаюсь запустить скрипт, я получаю это ошибка

script.rb:24:in `exec': ERROR:  syntax error at or near "," (PG::SyntaxError)
LINE 2: ...              VALUES (2222222,42424242,CANCEL,,2019-12-0...
                                                         ^

Итак, проблема начинается в csv.each. Я попытался удалить "статус клиента" из csv.each, и тогда это сработало.

#{row['client_status']}

, потому что в файле csv некоторые строки "client_status" пусты, и я не знаю, как заставить ruby пропустить пустое место или как-то подсчитать пустое место, но в кавычках. Возможно, когда я запускаю скрипт, можно поставить каждую строку в кавычки. На данный момент мой сценарий считает, что я хочу вставить запятую, но это просто разделитель

"42424242", "2019-12-09 14:01:17","  ", "CANCEL"," "," "," ", "1", "0", "some name", "2222222", "info", "info", "242424"," ", "0", 

РЕДАКТИРОВАТЬ: проблема была не с CSV-файл или pg_conn.exec Это на самом деле мой sql функция с ошибкой Но принятый ответ также исправил мою проблему, и мне не пришлось менять свою sql функцию.

1 Ответ

1 голос
/ 29 января 2020

Я не знаю, как заставить ruby пропустить пустое место или как-то подсчитать пустое место, но в кавычках

Драгоценный камень PG поставляется с методом exec_params, который преобразует Ruby объекты в допустимые SQL типы, например, пустую строку в "", nil в NULL и c.

exec_params принимает два аргумента : запрос SQL в виде строки и объекты Ruby в виде массива. В запросе SQL вы можете использовать $1, $2, $3 et c. (На основе 1) для ссылки на объекты в массиве (на основе 0).

Примерно так должно работать:

csv.each do |row|
  values = row.fields('custom_field_2', 'phone_number', 'client_status', 'operator_status', 'start_time', 'sip')

  pg_conn.exec_params(<<-SQL, values)
    INSERT INTO testing (custom_field_2, phone_number, client_status, operator_status, start_time, sip)
      VALUES ($1, $2, $3, $4, $5, $6);
  SQL
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...