Как передать параметры JSON в пост-запросе «Создать проект» OpenRefine ReST-API?

В настоящее время я пытаюсь загрузить таблицы Excel (как .xls) в модуль OpenRefine (или OntoRefine) Ontotexts GraphDB. Поскольку у меня были проблемы с загрузкой xls, я решил сначала преобразовать файл xls в файл csv, а затем загрузить его. К сожалению, OpenRefine не каждый раз автоматически распознает файл как CSV. Таким образом, все данные в каждой строке хранятся в одном столбце. Например.:

--------------------------------------------------
|      Col1,     Col2,     Col3,     Col4        |
--------------------------------------------------
|      Row11,     Row12,     Row13,     Row14    |
--------------------------------------------------
|      Row21,     Row22,     Row23,     Row24    |
--------------------------------------------------

Вместо:

--------------------------------------------------
|      Col1    |  Col2    |  Col3    |  Col4     |
--------------------------------------------------
|      Row11   |  Row12   |  Row13   |  Row14    |
--------------------------------------------------
|      Row21   |  Row22   |  Row23   |  Row24    |
--------------------------------------------------

С почтовым запросом

POST /command/core/create-project-from-upload

формат файла в параметре «формат» и json с разделителем в параметре «параметры» могут быть добавлены в запрос POST. Однако это тоже не работает, и официальная документация OpenRefine (https://github.com/OpenRefine/OpenRefine/wiki/OpenRefine-API) не содержит никаких подсказок относительно синтаксиса JSON «опций».

Мой текущий код выглядит так:

import os
import xlrd
import csv
import requests
import re

xls_file_name_ext = os.path.basename('excel_file.xls')

# create the filename with path to the new csv file (path + name stays the same)
csv_file_path = os.path.dirname(xls_file_name_ext) + '/' + os.path.splitext(xls_file_name_ext)[0] + '.csv'

# remove all comma in xls file
xls_wb = xlrd.open_workbook(xls_file_name_ext)
xls_sheet = xls_wb.sheet_by_index(0)
for col in range(xls_sheet.ncols):
    for row in range(xls_sheet.nrows):
        _new_cell_val = str(xls_sheet.cell(row, col).value).replace(",", " ")
        xls_sheet._cell_values[row][col] = _new_cell_val

# write to csv
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
    c_w = csv.writer(csv_file, delimiter=',')
    for row in range(xls_sheet.nrows):
        c_w.writerow(xls_sheet.row_values(row))

ontorefine_server = 'http://localhost:7200/orefine'

# filename of csv as project name in OntoRefine
onterefine_project_name = os.path.splitext(os.path.basename(csv_file_path))[0]

# the required paraneters for the post request
ontorefine_data = {"project-name": onterefine_project_name,
                   "format": "text/line-based/*sv",
                   "options": {
                       "separator": ","
                                }
                   }
ontorefine_file = {'project-file': open(csv_file_path, "rb")}

# execute the post request
ontorefine_response = requests.post(
    ontorefine_server + '/command/core/create-project-from-upload', data=ontorefine_data, files=ontorefine_file
)

Я предполагаю, что неправильно передаю параметры запроса POST.

Поскольку ваши данные публикации выглядят нормально, это может быть связано с вашим форматом — можете ли вы опубликовать образец строки из своего набора данных?

Radostin Nanov 15.04.2019 14:55

Как уже упоминалось, данные находятся в формате xls, а затем конвертируются в формат CSV. Поскольку это конфиденциальные данные, я сделал их неузнаваемыми. Данные в формате CSV (заголовок и данные) выглядят так:[C1];[C2];C3;C4;[C5];C6;C7;C8;C9;C10;C11;C12;C13;C14;C‌​15;C16;C17;C18;C19;C‌​20;C21;C22;C23;C24;C‌​25;[C26];C27;C28;[C2‌​9];[C30];[C31];C32;C‌​33;C34;C35;C36;C37;C‌​38;C39;C40;C41;C42;C‌​43;C44;C45;C46;C47;C‌​48;C49;[C50];C51 ABC;1234;0A1; A AA 13 BB 13 CC;FOO, BAR;FOO_123;100;2;foo bar ;1f4+5b8+9;9000; FO876 ;01.01.1900;;;;;;;1.0.0;AB;;;;;ZY;1234;;1;ZY;;;;;;;;;;;;A;;;‌​A1B;987;65;B;Z0; A AA 13 BB 13 CC;123456

Alex R. 24.04.2019 17:06

Кроме того, xls-файлы обычно имеют от 2 000 до 10 000 строк, при этом файлы с большим количеством строк обычно распознаются правильно чаще.

Alex R. 24.04.2019 17:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
272
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Конечно, все зависит от ваших входных данных, но с форматированием все в порядке. Вот что OntoRefine делает «за кулисами», если вы пытаетесь импортировать из пользовательского интерфейса. Вы можете сами увидеть ту же полезную нагрузку, перехватив сетевой трафик:

{
"format": "text/line-based/*sv",
"options": {
    "project-name":"Your-project-here",
    "separator":","
}

Судя по этому, похоже, что единственное отличие — местоположение имени проекта. Вот команда curl, которая делает то же самое:

curl 'http://localhost:7200/orefine/command/core/importing-controller?controller=core%2Fdefault-importing-controller&jobID=1&subCommand=create-project' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' --data 'format%3Dtext%2Fline-based%2F*sv%26options%3D%7B%22separator%22%3A%22%2C%22%22projectName%22%3A%22Your-project-name%22%7D'

Другие вопросы по теме