Использование эвристики для понимания столбцов таблицы - PullRequest
0 голосов
/ 02 февраля 2011

У меня есть набор значений, разделенных точкой с запятой, извлеченных из таблицы, и мне нужно обработать эти данные.

К сожалению, я не знаю, в какой колонке есть какая информация.

Вот некоторые примеры данных:

5036;MORAN;68681J;FBOP;40;872,7;OUT
5037;MORAN;68624J;GFBOP;40;872,7;OUT
5038;ITAKHOOLI;12124J;TGFOP;40;712,7;245
5039;ITAKHOOLI;12183J;GBOP;40;872,7;125
5040;ITAKHOOLI;12294J;GBOP;40;832,7;125
5041;ITAKHOOLI;12421J;GBOP;32;792,7;125
5042;NYA GOGRA;87230K;TGFOP;20;732,7;OUT

Я знаю несколько вещей о данных, таких как:

  • В столбце с самыми длинными строками указано название компании
  • Столбцы со словами GBOP, FBOP и т. Д. Являются категорией (у меня есть их список)
  • Столбец с порядковыми номерами является номером лота
  • и т.д.

Если бы я знал, в каком столбце будет что, писать сценарий было бы легко, но я не знаю. Другая проблема состоит в том, что порядок данных может измениться - тот, который я привел выше, был только примером. Есть ли инструмент / драгоценный камень, который позволил бы мне написать некоторые правила, чтобы разобраться в этих данных и организовать их?

Спасибо.

(Пожалуйста, измените название поста, если вы считаете, что оно может быть более подходящим)

1 Ответ

0 голосов
/ 02 февраля 2011

Вероятно, CSV-модуль Ruby мог бы справиться с этим, но это простая задача - разбить вещи на что-то более организованное.

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

  • field3 может быть инвентарным номером.
  • field6 может быть ценой за единицу в недолларовой валюте из-за запятой, которая часто используется как десятичная дробь за пределами США.
  • field7 - текущий уровень инвентаря.

#!/usr/bin/env ruby

data = <<END_DATA.split("\n")
5036;MORAN;68681J;FBOP;40;872,7;OUT
5037;MORAN;68624J;GFBOP;40;872,7;OUT
5038;ITAKHOOLI;12124J;TGFOP;40;712,7;245
5039;ITAKHOOLI;12183J;GBOP;40;872,7;125
5040;ITAKHOOLI;12294J;GBOP;40;832,7;125
5041;ITAKHOOLI;12421J;GBOP;32;792,7;125
5042;NYA GOGRA;87230K;TGFOP;20;732,7;OUT
END_DATA

Создать массив хэшей:

records = data.inject([]){ |ary, row| 
  fields = row.split(';')
  record = Hash[ *[:id, :company_name, :field3, :category, :field5, :field6, :field7 ].zip(fields).flatten ]
  ary << record
}

require 'pp'
pp records

Что выводит что-то похожее на то, что вы получите, если запросите данные, используя поиск SQL:

[{:id=>"5036",
  :company_name=>"MORAN",
  :field3=>"68681J",
  :category=>"FBOP",
  :field5=>"40",
  :field6=>"872,7",
  :field7=>"OUT"},
{:id=>"5037",
  :company_name=>"MORAN",
  :field3=>"68624J",
  :category=>"GFBOP",
  :field5=>"40",
  :field6=>"872,7",
  :field7=>"OUT"},
{:id=>"5038",
  :company_name=>"ITAKHOOLI",
  :field3=>"12124J",
  :category=>"TGFOP",
  :field5=>"40",
  :field6=>"712,7",
  :field7=>"245"},
{:id=>"5039",
  :company_name=>"ITAKHOOLI",
  :field3=>"12183J",
  :category=>"GBOP",
  :field5=>"40",
  :field6=>"872,7",
  :field7=>"125"},
{:id=>"5040",
  :company_name=>"ITAKHOOLI",
  :field3=>"12294J",
  :category=>"GBOP",
  :field5=>"40",
  :field6=>"832,7",
  :field7=>"125"},
{:id=>"5041",
  :company_name=>"ITAKHOOLI",
  :field3=>"12421J",
  :category=>"GBOP",
  :field5=>"32",
  :field6=>"792,7",
  :field7=>"125"},
{:id=>"5042",
  :company_name=>"NYA GOGRA",
  :field3=>"87230K",
  :category=>"TGFOP",
  :field5=>"20",
  :field6=>"732,7",
  :field7=>"OUT"}]

Альтернативный способ просмотра данных - это хеш хешей:

records = data.inject({}){ |h, row| 
  fields = row.split(';')
  record = Hash[ *[:id, :company_name, :field3, :category, :field5, :field6, :field7 ].zip(fields).flatten ]
  h[fields.first] = record
  h
}

pp records

Какие выходы

{"5036"=>
  {:id=>"5036",
  :company_name=>"MORAN",
  :field3=>"68681J",
  :category=>"FBOP",
  :field5=>"40",
  :field6=>"872,7",
  :field7=>"OUT"},
"5037"=>
  {:id=>"5037",
  :company_name=>"MORAN",
  :field3=>"68624J",
  :category=>"GFBOP",
  :field5=>"40",
  :field6=>"872,7",
  :field7=>"OUT"},
"5038"=>
  {:id=>"5038",
  :company_name=>"ITAKHOOLI",
  :field3=>"12124J",
  :category=>"TGFOP",
  :field5=>"40",
  :field6=>"712,7",
  :field7=>"245"},
"5039"=>
  {:id=>"5039",
  :company_name=>"ITAKHOOLI",
  :field3=>"12183J",
  :category=>"GBOP",
  :field5=>"40",
  :field6=>"872,7",
  :field7=>"125"},
"5040"=>
  {:id=>"5040",
  :company_name=>"ITAKHOOLI",
  :field3=>"12294J",
  :category=>"GBOP",
  :field5=>"40",
  :field6=>"832,7",
  :field7=>"125"},
"5041"=>
  {:id=>"5041",
  :company_name=>"ITAKHOOLI",
  :field3=>"12421J",
  :category=>"GBOP",
  :field5=>"32",
  :field6=>"792,7",
  :field7=>"125"},
"5042"=>
  {:id=>"5042",
  :company_name=>"NYA GOGRA",
  :field3=>"87230K",
  :category=>"TGFOP",
  :field5=>"20",
  :field6=>"732,7",
  :field7=>"OUT"}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...