В настоящее время я пытаюсь загрузить таблицы 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.
Как уже упоминалось, данные находятся в формате 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
Кроме того, xls-файлы обычно имеют от 2 000 до 10 000 строк, при этом файлы с большим количеством строк обычно распознаются правильно чаще.
Конечно, все зависит от ваших входных данных, но с форматированием все в порядке. Вот что 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'
Поскольку ваши данные публикации выглядят нормально, это может быть связано с вашим форматом — можете ли вы опубликовать образец строки из своего набора данных?