2016-01-21 3 views
6

Сценарий:Как получить Переупорядочьте столбец с входным CSV фиксированного столбца в Pentaho

Я создал преобразование для загрузки данных в таблицу из CSV-файла, и у меня есть следующие столбцы в CSV файле:

  1. customer_id
  2. company_id
  3. Employee_Name

Но пользователь может дать входной файл Колонка заказ (в случайном порядке), как

  1. Employee_Name
  2. company_id
  3. customer_id

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

+0

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

+0

Привет @ Brian.D.Myers может дать мне пример с ktr-файлом с UDJC или JavaScript, чтобы продолжить мой вопрос ... высоко appericiated – yuvi

ответ

3

Использование ETL Metadata Injection вы можете использовать преобразование, как это, либо нормализовать данные, или сохранить его в базу данных:

Metadata transformation

Тогда вам просто нужно отправить правильные данные для этой трансформации. Вы можете прочитать строку заголовка из CSV и использовать Row Normaliser для преобразования в формат, используемый ETL Metadata Injection.

Я включил здесь быстрый пример: csv_inject on Dropbox, если вы сделаете что-то вроде этого и запустите его из чего-то, что запускает его за файл csv, он должен работать.

+0

Ваша ссылка не работает – Stevetech

0

Вы могли бы попробовать что-то вроде этого, как ваш JavaScript:

//Script here 

var seen; 
trans_Status = CONTINUE_TRANSFORMATION; 
var col_names = ['Customer_Id','Company_Id','Employee_Name']; 
var col_pos; 
if (!seen) { 
    // First line 
    trans_Status = SKIP_TRANSFORMATION; 
    seen = 1; 
    col_pos = [-1,-1,-1]; 
    for (var i = 0; i < col_names.length; i++) { 
     for (var j = 0; j < row.length; j++) { 
      if (row[j] == col_names[i]) { 
       col_pos[i] = j; 
       break; 
      } 
     } 
     if (col_pos[i] === -1) { 
      writeToLog("e", "Cannot find " + col_names[i]); 
      trans_Status = ERROR_TRANSFORMATION; 
      break; 
     } 
    } 
} 

var Customer_Id = row[col_pos[0]]; 
var Company_Id = row[col_pos[1]]; 
var Employee_Name = row[col_pos[2]]; 

Вот .ktr я попробовал: csv_reorder.ktr

(редактирование, вот тест CSV-файлов) 1.csv:

Customer_Id,Company_Id,Employee_Name 
cust1,comp1,emp1 

2.csv:

Employee_Name,Company_Id,Customer_Id 
emp2,comp2,cust2 
+0

вы можете дать мне образец, основанный на моем примере .. я не получаю ваш ktr..использование java-кода .. есть какой-либо другой способ для процедуры вместо java-кода – yuvi

+0

Это основано на вашем примере. Что значит «не получить свой ktr»? – bolav

+0

Я пробовал ваш csv_reorder.ktr..but, я не получаю ожидаемого результата – yuvi

2

Ох, вот некоторые неприятные javascript!

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

В папке с образцами PDI есть образцы, а также посмотрите пример «фигурирующего формата файла» в проекте матовых роликов на github.

+0

Huh. Я попробовал это с помощью «ETL метаданных инъекции», но, никогда не используя его раньше, я не получил его работу. Думаю, я должен попробовать еще раз. Раньше я предварительно обрабатывал такие вещи с помощью скрипта Python. –

+0

Это не очень конструктивный ответ. Прежде всего, вы говорите, что решение плохое, не говоря о том, что плохого в этом. И тогда вы говорите, что существует другое решение, не сообщая о том, как его решить. Я ничего не узнал из вашего ответа, кроме того, что может существовать другой ответ. – bolav

+0

@codek ... может уметь привести пример и объяснить мне ... заранее спасибо – yuvi

0

Предполагая, что отклонение входного файла не является вариантом, у вас в основном есть 4 решения.

  1. изменить порядок полей во внешнем редакторе (не используйте первенствует, если он содержит даты)
  2. Используйте код в вашей трансформации, чтобы обнаружить заголовки столбцов и изменить порядок файла.
  3. Использование инъекции метаданных, предложенное bolav
  4. Создайте работу. Это необходимо для:

a. загрузите файл во временную базу данных. b. используйте инструкцию sql для извлечения полей (используйте SELECT с предложением ORDER BY) c. выведите файл в правильном порядке.