2016-05-23 17 views
0

Мне нужно создать пакет, который разбивает огромный плоский файл на несколько плоских файлов.Разделить плоский файл на несколько файлов

У меня есть плоский файл, который имеет 20 миллионов строк, и теперь мне нужно разделить этот плоский файл (каждый плоский файл должен иметь 55 к строкам)

Примера: - если есть 111 строк в общем, я бы необходимо создать 3 файла.

file1.txt будет иметь 1-55 строк file2.txt будет иметь 55-110 строки file3.txt будет иметь 1 строку .

Какие у меня варианты?

Я использую Visual Studio 2012 для этого проекта.

+0

вы в состоянии или иметь возможность использовать задачу сценария или вы хотите используйте поток данных – SFrejofsky

+0

Я не умею писать сценарии, но я открыт для конструктивных предложений. –

ответ

1

вы можете попробовать что-то вроде этого ... его довольно рудиментарно, и я уверен, что кто-то укажет, что это не будет самая эффективная вещь, но ее твердый вариант. Обратите внимание, что вам нужно будет добавить некоторые попытки обработки ошибок catch.

  int recper = 0; // this is where you will assign the number of records per file 
      int reccount = 0; 
      int filecount = 1; 
      string filename = "testfilename"; 
      string networkDirectory = @"c:\fakepath\"; 
      string fileToRead = @"c:\fakepath\textfile.txt"; 

      using (StreamReader reader = new StreamReader(fileToRead,Encoding.Default,true)) 
      { 
       while (reader.Peek() > 0) 
       { 
        using (StreamWriter writer = new StreamWriter(Path.Combine(networkDirectory, filename + filecount + ".txt"), true, Encoding.Default)) 
        { 
         writer.Write(reader.ReadLine()); 
        } 
        reccount++; 
        // checks on each iteration of the while loop to see if the 
        // current record count matches the number of records per file 
        // if sso reset reccount and change increment filecount to change the file name 
        if (reccount == recper) 
        { 
         reccount = 0; 
         filecount++; 
        } 
       } 
      } 
+0

Можете ли вы сказать мне, где вы ввели условие, что 1 плоский файл должен иметь только 50 к строк. Мне жаль, что я задал вам этот глупый вопрос. –

+1

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

1

Другим способом вы можете сделать это в поток данных:

Первый использовать ваш метод выбора, чтобы добавить столбец «номер строки» на ваш поток данных (если не существует уже один в своем плоском файле выход, в этом случае пропустите этот шаг и использовать его):

https://www.google.com/search?sourceid=navclient&aq=&oq=add+rownumber+column+to+ssis+dataflow&ie=UTF-8&rlz=1T4GGNI_enUS551US551&q=add+rownumber+column+to+ssis+dataflow&gs_l=hp....0.0.0.6218...........0._Qm62-0x_YQ

Затем добавьте MultiCast преобразования в свой поток данных, и использовать номер строки для разделения потока и отправить его в различные пункты назначения:

Row 1 - 55k -> File1

Row 55001 - 110k -> File2

и т.д.

+0

У меня есть несколько миллионов записей и по этой логике мне понадобится 300 + многоадресная трансформация? Любой альтернативный подход? –

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