Мы могли бы начать с ваших исходных данных и написать функцию, которая преобразует строку TSV (с заголовками) в массив объектов.
Это tsv2arr
(слегка изменено по сравнению с более ранним ответом ) делает это, сначала обрезая любой начальный или конечный пробел, разбивая на новые строки и разбивая каждую строку на вкладках. Выходные данные первой строки становятся именами полей заголовка, а остальные уменьшаются в объекты, беря каждое значение и соединяя его с заголовком с тем же индексом. Значения, которые выглядят как числа, преобразуются в числа; это может конвертировать некоторые вещи, которые вы не хотите конвертировать, но вы можете затем обработать их, если вам нужно их изменить.
Код достаточно прост:
const tsv2arr = (tsv) => {
const [headers, ...rows] = tsv .trim () .split ('\n') .map (r => r .split ('\t'))
return rows .reduce ((a, r) => [
... a,
Object .assign (... (r .map (
(x, i, _, c = x.trim()) => ({[headers [i].trim()]: isNaN(c) ? c : Number(c)})
)))
], [])
}
const tsv = `
Row ID O ID O Date Ship Date Ship Type Customer ID Customer Name Seg Country City State Zip Code Region Product ID Category Sub-Category Product Name Sales Quantity Discount Profit
1 PA-152156 11/9/20 01/19/16 Second Class CG-125 Clay bute Consumer United States Henderson Kentucky 42420 South FUR-BO-10001798 Furniture Bookcases Bush, Somerset Collection Bookcase? 261.96 2 0 41.9136
2 ST-621973 8/9/20 02/10/16 First Class XY-139 Foobar Inc Consumer United States Madison Wisconsin 53702 Midwest FUR-SO-10003869 Furniture Sofas Tyler, Some Random Sofa Name 963.85 1 0 265.89
3 MQ-169437 12/7/20 03/15/16 Second Class CG-125 Clay bute Consumer United States Henderson Kentucky 42420 South FUR-DE-10005309 Furniture Desk Adams, Some Random Desks Name? 654.13 1 0 143.28
`
console .log (
tsv2arr (tsv)
)
.as-console-wrapper {min-height: 100% !important; top: 0}
Редактировать : добавлено trim
в ячейки. Это не может быть необходимым; вероятно, это всего лишь артефакт моего форматирования ввода для выравнивания вкладок. Но трудно представить, что это причиняет боль и может помочь в определенных обстоятельствах. Обратите внимание, что в исходном тексте много лишних пробелов, чтобы столбцы располагались прямо на странице. Они, конечно, совершенно не имеют значения, и это trim
избавляет от них.
Альтернатива
Если вы действительно хотите начать с этого формата ввода, вы можете написать что-то вроде этого:
const data = [
{"Row ID O ID O Date Ship Date Ship Type": "1 PA-152156 11/9/20 01/19/16 Second Class"},
{"Row ID O ID O Date Ship Date Ship Type": "2 ST-621973 8/9/2 02/10/16 First Class"}
]
const buildObj = (kv) =>
Object .entries (kv) .map (([k, v]) => {
const keys = k .split ('\t')
const vals = v .split ('\t')
return Object .assign (... keys .map ((k, i) => ({[k]: vals [i]})))
})
console .log (
data .flatMap (buildObj)
)
Но этот формат имеет для меня очень мало смысла, по крайней мере, в качестве транспортного формата. Если ничего другого, это довольно избыточно.
Я подозреваю, что у вас есть проблема, когда у вас нет вкладок, которые, как вы думали, были у вас. Текстовые редакторы программистов часто настроены на замену вкладок пробелами; это может быть то, что здесь происходит. Например, то, что вы вставили в вопрос, не включает вкладки.
Я бы посоветовал вам попытаться исправить проблемы ввода и использовать что-то более похожее на исходный ответ. Это обходной путь для некоторых странных данных, которые, скорее всего, являются артефактом вашего процесса разработки / отображения, а не чем-то фундаментальным.