2013-09-16 5 views
0

Надеюсь, это имеет смысл, но мне нужна помощь. Я получаю CSV-файл от нашего клиента и не отправляет нам файл стандартного формата. По большей части файл содержит 1 столбец длиной до миллиона строк, но иногда они отправляют нам несколько столбцов с миллионом строк в каждом столбце. Я предполагаю, что они используют Excel и сохраняют как CSV.Разберите динамический столбец csv в один столбец

Мой вопрос в том, как очистить файл, поэтому нам не нужно вручную менять его на один столбец? Прямо сейчас я делаю SqlBulkCopy с DataTable. Для этого нет записей заголовков.

Я открыт для использования SSIS программно или просто выполняет логику в tsql, если это необходимо, но предпочел бы этого не делать. Я бы предпочел сделать это в моем приложении C#. Сотрудник предложил импортировать в таблицу хранения импорта и использовать союзы для получения одного столбца, а затем вставить в таблицу, которая используется для другой логики. Пожалуйста помоги?!?

EDIT: я понял, пример может быть полезен вот так вот моя попытка:

Файл приходит так: аа, бб, куб.см, дд

Я хочу, чтобы это выглядело как это: аа бб куб.см дд

Примечание: Столбцы будут фиксированной шириной, но количество столбцов динамическое.

EDIT # 2: В итоге я сделал для этого другой маршрут, главным образом из-за ограничения времени. Я сделал, что создал временную таблицу импорта с 25 столбцами. Я использовал SqlBulkCopy для сопоставления столбцов для этого. Сопоставления столбцов будут зависеть от количества столбцов в DataTable, и я просто использую для этого foreach.

Затем я вызываю хранимую процедуру для «обработки» записей, делая UNION ALL для каждого столбца и импортируя их в итоговую таблицу. Это также помогло с проблемами с иногда записью заголовка, и иногда в столбце были пробелы, потому что это было не так долго, как предыдущие. Поскольку существует уникальное ограничение для поля в производстве, не может быть нескольких пустых записей.

Не элегантный, но я получил его на работу.

+2

Чтобы исправить это вручную, вы вырезаете все значения во втором столбце и вставляете их в нижней части 1-го столбца? – David

+0

Это вариант, но в первый раз это произошло, мы сделали отдельные файлы и разрешили мультивыбор и просто использовали цикл foreach, чтобы пройти через все. – campbm56

+0

Да, пожалуйста, объясните, что должно произойти, когда имеется более одного столбца. Вы, как @David спрашивает, добавьте его до конца, вы объединяете A1 и B1 для своего вывода или просто игнорируете столбец B? – billinkc

ответ

1

enter image description here По Вашему запросу, здесь более общее решение. Замените источник OLEDB в моем предыдущем решении плоским файлом. Затем выполните шаги, изображенные на диаграмме.

+0

Я попробовал это после того, как внедрил свое решение, и я смог заставить вас работать. Большое вам спасибо за это! – campbm56

0

Вы можете использовать библиотеку, такую ​​как http://blogs.msdn.com/b/jmstall/archive/2012/03/24/opensource-csv-reader-on-nuget.aspx, где вы читаете данные в IEnumerable. Затем используйте оператор Linq Select, чтобы вернуть поле.

var resultField1 = reader.Select(row => row.field1); 

var resultField2 = reader.Select(row => row.field2); 


var combined = resultField1.Concat(resultField2); 

combined.ToList().ForEach(r => DataTableToUpload.NewRow({r}); 

С помощью комбинированных данных вы можете легко добавить dq = ata в datatable.

+0

Я бы просто пропустил так, чтобы он был динамичным в количестве колоний, которые у него есть? – campbm56

+0

Да. Комбинированный тип представляет собой IEnumberable , который можно преобразовать в список и даже в datarow. Я немного изменил этот пример. – jcwrequests

0

Вы можете использовать асинхронный компонент скрипта. Образец здесь. Вы можете сделать это умным, чтобы определить количество столбцов и соответственно добавить эти много строк. Практикуйте с ним, и если вам нужна помощь, сообщите нам об этом. enter image description here

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

SELECT f1 AS OneColumn FROM [dbo].[TempTable] 
UNION ALL 
SELECT f2 AS OneColumn FROM [dbo].[TempTable] 
+0

Как это будет работать, если бы у меня было разное количество столбцов каждый раз? – campbm56

+0

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

Смежные вопросы