2012-04-30 1 views
3

У меня есть очень простой текстовый файл, содержащий два значения, разделенные запятой, длина которых составляет около 100 строк. Этот файл создается автоматическим процессом (который я не могу контролировать), и я импортирую этот файл в SQL через SSIS.Как удалить пробелы при импорте плоского файла, содержащего промежуточные пустые строки?

Моя работа очень хорошо, за исключением случаев, когда в файле есть пустая строка. Под этим я подразумеваю, что он полностью пуст - никаких запятых или других символов. Когда это существует в файле, запись непосредственно после него будет импортирована с двумя пробелами перед импортированным значением.

Например, если текстовая строка содержит это «ABC, 123», импортированное значение SQL будет «ABC» для первого столбца. Я попытался удалить это, используя производный столбец с инструкцией TRIM, но это не повлияло. Функция REPLACE также не работала. Действительно странная часть заключается в том, что если я добавлю средство просмотра данных непосредственно перед потоком передачи данных, значение будет выглядеть нормально. Я даже добавил звездочки, так что я мог «видеть» пространство, если они существуют, например:

"*" + REPLACE([Column 0]," ","") + "*" 

Это чрезвычайно раздражает вопрос, и я бы очень признателен за любые предложения. Спасибо!

ответ

9

Вот один из способов сделать это. Вы можете использовать преобразование Script Component внутри задачи Data Flow Task для очистки данных.

  • Вот пример файла, который представляет данные, похожие на вашу проблему. Обратите внимание на вторую строку с двумя пробелами и фактическими данными.

file with issue

  • Когда файл был импортирован непосредственно в таблицу, используя плоский исходный файл и OLE DB назначение, был пустым вопросом перед второй строкой импортируемой в файл.

invalid data

  • Чтобы устранить проблему преобразование компонент сценария должен быть введен между плоским напильником и OLE DB назначения. При перетаскивании компонента сценария выберите Трансформация.

transformation

  • Ваша задача потока данных будет выглядеть примерно так.

data flow task

  • Дважды щелкните на компоненте сценария, чтобы привести редактора сценариев трансформации. В столбцах ввода выберите первый столбец, который считывается из вашего файла. Здесь в этом случае столбец Name.

input columns

  • На секции входов и выходов, создать новый столбец с именем CleansedData типа string данных. Этот новый столбец будет содержать чистый вывод, который не содержит пробелов.

inputs and outputs

  • На участке сценария, нажмите на кнопку Изменить сценарий, чтобы привести редактора сценариев.

script

  • В редакторе сценария, изменить код в методе Input0_ProcessInputRow, как показано ниже. этот код заменяет возврат каретки + линию с пустым текстом, а затем выравнивает любые пробелы, окружающие текст.

код сценария:

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    Row.CleansedData = Row.Name.Replace(@"\r\n", string.Empty).Trim(); 
} 

script code

  • Теперь в вашем OLE DB назначения, заменить старые колонки с этой новой колонке CleansedData в секции отображения столбца.

  • После внесения вышеуказанных изменений пакет был выполнен против того же файла, содержащего пробелы. на этот раз перед второй строкой не были вставлены пробелы.

Надеюсь, что это поможет.

clean data

+0

Шиву - СПАСИБО за очень подробный ответ. Будет ли вам польза от этого, а не просто делать REPLACE внутри производной колонки напрямую? – Loki70

+0

Siva - Спасибо за разъяснение и отличную запись. Вы заработали свою классификацию «принятого ответа» (при том понимании, что метод выражения является альтернативой). – Loki70

1

Понял - кто-то ответил на это на другом форуме. Мне нужно было удалить невидимые персонажи CRLF, которые встречались вот так:

LTRIM(REPLACE(REPLACE([Column 0],"\n",""),"\r","")) 
0

Было очень полезно! Мне не нужно было счищать пробелы, а иногда и очищать, и этот пост показал мне, что именно мне нужно.

Это не может быть подходящим форумом для этой должности, но вот фрагмент в мой код:

DateTime dt = DateTime.Now; 
    string str_test = ""; 

    try 
    { 
     str_test = Row.SomeDate; 

     if (str_test.Length == 8) 
     { 
      // date example: 20151231 
      str_test = str_test.Insert(6, @"/"); 
      str_test = str_test.Insert(4, @"/"); 

      dt = Convert.ToDateTime(str_test); 
      Row.CleansedDate = Row.SomeDate.; 
     } 
     else 
     { 
      // test for some other date 
      dt = Convert.ToDateTime(str_test); 
      Row.CleansedDate = Row.SomeDate; 
     } 
    } 
    catch (Exception) 
    { 
     // this is not a date, return nothing 
     Row.CleansedDate = null; 
    } 
Смежные вопросы