Импорт плоских данных с несколькими разделителями - PullRequest
0 голосов
/ 19 сентября 2019

Мой импортированный плоский файл был импортирован в SQL с разделителями-запятыми.Пример моего текстового файла выглядит следующим образом:

Location\Floor\Room,Date,Value

После импорта:

Column 1            | Column 2 | Column 3
Location\Floor\Room | Date     | Value

Мне бы хотелось, чтобы моя таблица выглядела следующим образом:

Column 1 | Column 2 | Column 3 | Column 4 | Column 5
Location | Floor    | Room     | Date     | Value

ЕстьЕсть ли способы, которые я могу достичь, как указано выше?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Это работает для значения MAX 5 неделимой строки

val1 \ val2 \ val3 \ val4 \ val5

    select [1] as col1, [2] as col2, [3] as col3, [4] as col4, [5] as col5, col2 as col7, col3 as col8
    from (
        select ROW_NUMBER() over(partition by col1 order by col1) rowid, col1, col2, col3, value
        from <MyTable>
        cross apply string_split(s.col1, '\')
    ) as tbl
    pivot (
        max(value) for rowid in ([1], [2], [3], [4], [5])
    ) as pv
0 голосов
/ 19 сентября 2019

SSIS - SQL Server Integration Service также может использоваться для этого варианта использования.

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

После того, как у вас есть временная таблица и с записями (включая записи с backslash), вы должны затем использовать Derived Column Task в SSIS и создать собственную логику на основе методов SUBSTRING() and FINDSTRING() для создания новыхстолбцы для разделения строки на основе backslash

0 голосов
/ 19 сентября 2019

Я думаю об этом решении.

select t2.col1
    , t2.col2
    , substring(t2.col3, charindex('\', t2.col3, len(t2.col2) + len(t2.col1)) + 1, len(t2.col3) - (len(t2.col2) + len(t2.col1) + 2))
    , t2.[value], t2.[date] 
from (
        select t1.col1, substring(t1.main, len(t1.col1) + 2
            , charindex('\', t1.main, len(t1.col1) + 2) - (len(t1.col1) + 2)) as col2
            , t1.main as col3, t1.[value], t1.[date] 
        from (
            select substring(column1, 0, charindex('\', column1)) as col1, column1 as main, [date], [value] 
            from tableA
            ) t1
        ) t2 
...