Преобразование необработанных строковых данных со схемой, основанной на фиксированной позиции, в объектную структуру, подобную JSON

#javascript #python #json #performance #type-conversion

#javascript #python #json #Производительность #преобразование типов

Вопрос:

Мой вариант использования выглядит следующим образом,

Формат ввода — строка с фиксированной общей длиной, и каждый набор фиксированных позиций представляет некоторое значение.

Например. Пусть входные данные будут "ABCDE12345" и учитывают, что позиции с 1 по 3 ("ABC") будут представлять значение поля 1, позиции с 4 по 7 ("DE12") будут представлять значение поля 2, позиции с 8 по 10 ("345") будут представлять значение поля 3

Формат вывода — объектно-ориентированная структура, такая как JSON

 {
"field1" : "ABC",
"field2" : "DE12",
"field3" : "345"
}
  

Мои требования в порядке приоритета

  1. Преобразование из входного формата в выходной формат, например JSON
  2. Скорость преобразования должна быть как можно более быстрой. Язык программирования может быть выбран соответствующим образом. Предпочтительно js или python. В качестве решения также приветствуются другие языки.
  3. (Необязательно) Как мы можем масштабировать это решение для 1000 конверсий как можно быстрее?

Комментарии:

1. И что вы пробовали до сих пор, например, разделить эту строку на три части и т.д.? Я бы с удовольствием написал код для вашего домашнего задания, но, к сожалению, вам придется нанять меня :/

2. Я попробовал решение с помощью Java script. Шаг 1 — разделение с помощью регулярных выражений в массив, шаг 2 — подача элементов массива в структуру json. Я хотел искать разные варианты у других программистов, а не исправлять свое решение. Приветствуется любое решение, которое удовлетворит моему варианту использования.

Ответ №1:

  1. Попробуйте это:

string_to_dict = lambda input_str: {«field1»:input_str[:3], «field2»:input_str[3:7], «field3»:input_str[7:]} string_to_dict(«ABCDE12345»)

{‘field1’: ‘ABC’, ‘field2’: ‘DE12’, ‘field3’: ‘345’}

  1. скорость зависит от вашего источника ввода. в случае, если у вас есть фрейм данных pandas, вы можете увеличить скорость, применив эту функцию к ряду с помощью функции «map»:

df[‘stinrg_series’].map(string_to_dict)

Ответ №2:

Если вы подготовите структуру данных, представляющую поля с именами и длинами в последовательном порядке, вы можете применить ее в понимании словаря для разделения данных на отдельные ключи и значения. Затем используйте модуль json для преобразования словаря

 from itertools import accumulate
import json

structure = [("field1",3),("field2",2),("field3",5)]      # define names and lengths
positions = [0,*accumulate(size for _,size in structure)] # computed starting positions

data      = "ABCDE12345"
dictdata  = { name:data[pos:pos size] for (name,size),pos in zip(structure,positions) }
jsondata  = json.dumps(dictdata)

print(jsondata)
# {"field1": "ABC", "field2": "DE", "field3": "12345"}
  

Ответ №3:

Вы могли бы сделать что-то вроде этого:

 function strToObj(str, interface) {
  const outObj = {};
  let index = 0;

  Object.entries(interface).forEach(([key, value]) => {
    outObj[key] = str.slice(index, index   value);
    index = value
  });

  return JSON.stringify(outObj);
}

const testStr1 = 'ABCDE12345';
const testInterface1 = {
  key1: 3, // 'key1' will become the object key and 3 indicates the number of characters to use for the value
  key2: 4,
  key3: 3
}

const testStr2 = ' 15417543010';
const testInterface2 = {
  intlPrefix: 2,
  localPrefix: 3,
  phonenumber: 7
}

console.log(strToObj(testStr1, testInterface1));
console.log(strToObj(testStr2, testInterface2));  

Или упрощенная версия, если вам не нужно создавать повторно используемую функцию