#openrefine #graphdb
#openrefine #graphdb
Вопрос:
В настоящее время я пытаюсь загрузить таблицы 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-запроса
POST /command/core/create-project-from-upload
формат файла в параметре «формат» и json с разделителем в параметре «параметры» могут быть добавлены к POST-запросу. Однако это также не работает, и официальная документация OpenRefine (https://github.com/OpenRefine/OpenRefine/wiki/OpenRefine-API ) не содержит никаких намеков на синтаксис JSON ‘options’.
Мой текущий код выглядит следующим образом:
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-запроса.
Комментарии:
1. Поскольку ваши данные post выглядят нормально, это может быть как-то связано с вашим форматом — можете ли вы опубликовать пример строки из вашего набора данных?
2. Как уже упоминалось, данные представлены в формате xls, а затем преобразуются в формат CSV. Поскольку это конфиденциальные данные, я сделал их неузнаваемыми. Данные выглядят следующим образом в формате CSV (заголовок и данные):
[C1];[C2];C3;C4;[C5];C6;C7;C8;C9;C10;C11;C12;C13;C14;C15;C16;C17;C18;C19;C20;C21;C22;C23;C24;C25;[C26];C27;C28;[C29];[C30];[C31];C32;C33;C34;C35;C36;C37;C38;C39;C40;C41;C42;C43;C44;C45;C46;C47;C48;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
3. Кроме того, xls-файлы обычно содержат от 2000 до 10000 строк, в результате чего файлы с большим количеством строк обычно распознаются корректно чаще.
Ответ №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/default-importing-controlleramp;jobID=1amp;subCommand=create-project' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' --data 'format=text/line-based/*sv&options={"separator":",""projectName":"Your-project-name"}'