2012-05-21 2 views
2

У меня есть огромный текстовый файл примерно 11 миллионов строк, я не могу его изменить, но я хотел бы иметь возможность обрабатывать его в удобном для использования формате , Это в основном структурированы:Углевый текстовый файл с разделителями табуляции Я хочу «нормализовать», пытаясь его с помощью SQL

Field1 : Type of data 
Field2 : Values 

Существует также ###, чтобы отметить начало и конец продукта в файле (до сих пор не уверен, что мне поможет)

в пределах данных что-то вроде 200 000 уникальных продуктов и всех связанных с ним данных. Значения Field1 будут повторяться (например, PRODUCT, PRICE, DESCRIPTION), и значения будут отличаться для идентификации атрибутов продуктов. Я импортировал файл с разделителями табуляции в Access и использовал SQL для получения данных, которые мне нужны (полный список всех продуктов), но было бы очень полезно иметь возможность обрабатывать его дальше и иметь все части, перечисленные в виде одного столбца, после чего по цене скажем, описание и т.д.

запросов Я пытался вытащить продукты из был:

select 
Field1, 
Field2 
from Index 
where Field1 = 'PRODUCT'; 

Это дает мне список всех продуктов

Я не уверен, простирающийся выше будет правильным правый подход, как если бы я его расширил (и извините синтаксис, я должен был иметь bash на SQL, чтобы получить это далеко)

select 
Field1, 
Field2 
from Index 
where Field1 = 'PRODUCT' 
and Field1 = 'PRICE'; 

(Если бы я получил, что на работу, что я уверен, что он не делает), я бы в такой же позиции, как я бы просто получить

Product 
Price 
Product 
Price 
x200000 

То, что я хотел бы сделать, это есть:

Product Price Description 
11111  1.11  This is part 1 
11112  1.12  This is part 2 

Я смотрю на примеры аналогичных, но я предполагаю, что люди привыкли работать с более входных файлов ... о, от того, что я видел SSIS может быть ключом? Опять же, никогда не играл с этим, но совершенно новым для него, и хочу посмотреть, возможно ли это через SQL.

Благодаря muchly

пример:

### 
PRODUCT A1000102 
SHORT_DESC SMALL COG 
PRICE 1.15 
RANDOM_ASSOCIATED B 
### 
PRODUCT A1000103 
SHORT_DESC MEDIUM COG 
PRICE 1.18 
RANDOM_ASSOCIATED B 
ROTATION YES 
### 
PRODUCT A1000104 
SHORT_DESC L COG 
PRICE 1.15 
RANDOM_ASSOCIATED 2 
### 
PRODUCT A1000105 
SHORT_DESC TITANIUM COG 
PRICE 4.12 
RANDOM_ASSOCIATED B 
### 
PRODUCT A1000106 
SHORT_DESC SMALL TITANIUM COG 
PRICE 1.15 
RANDOM_ASSOCIATED A 
COLOUR BLUE 
### 
PRODUCT A1000107 
SHORT_DESC SMALL COG 
PRICE 1.15 
RANDOM_ASSOCIATED C 
COUNTRY SWISS 
### 
PRODUCT A1000108 
SHORT_DESC SMALL COG 
PRICE 1.15 
RANDOM_ASSOCIATED X 
WEIGHT 9.54KG 
### 
+3

Образец необработанного файла может помочь –

+0

Простое открытие текстового файла с 11 миллионами строк, чтобы взять образец, дает мне головную боль. Я выберу вручную набор из нескольких продуктов. Дай мне пару минут. – user1351392

+4

Редактировать свой вопрос и разместить этот образец там – Cylindric

ответ

0

Вот мой совет: во-первых, использовать объемную вставку, чтобы загрузить данные в таблицу SQL. Затем используйте SQL-запросы для извлечения данных в любом формате, который может вам понадобиться для вторичных таблиц.

Почему я предлагаю это:

  1. При наличии ошибок при загрузке исходных данных, по какой-то причине, вы можете изолировать эти и исправить их.
  2. Если вы передумали в своей структуре данных после просмотра данных, вы можете сделать это, просто изменив запросы.
  3. Если вам нужно повторить процесс, вы можете сохранить все в операторах t-sql, которые будут запущены или изменены позже.
  4. Если у вас многопроцессорная машина, база данных должна максимально использовать ресурсы.

Если вам нужно поддерживать порядок строк в загруженной таблице, вы можете сделать это, используя представление.Создайте таблицу как-то вроде:

create table DirtyData (
    DirtyData_id int identity(1,1), 
    KeyNamevarchar(255), 
    Value varchar(255) 
); 

create view v_DirtyData as 
    select KeyName, Value 
    from DirtyData; 

Затем навалом вставить в вид, а не прямо в стол. Идентификатор будет назначен монотонно.

+0

Надеюсь, утилита загрузки сохранит порядок строк, или OP окажется в позиции _worse_. –

+0

#after edit # - Предполагается, что объемная вставка будет вставляться по порядку. Если вы многопроцессорный процесс, я готов поспорить с вами. –

+0

Я согласен использовать этот трюк в основном, чтобы просто добавить идентификатор в таблицу, а не последовательный идентификатор в оригинальном порядке (хотя обычно это делает). Вы можете приблизиться к гарантии заказа, установив BUFFER_SIZE = 1 в процессе импорта. Существует интересное обсуждение этого вопроса. Https://connect.microsoft.com/SQLServer/feedback/details/278452/there-needs-to-be-a-way-to-preserve-order-when-bulk-loading- файл. –