2015-07-13 3 views
0

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

"Intro information" 

"more Intro information" 

srvrmgr> "information about system" 

srbrmgr> list parameters for component *ADMBatchProc* 

"Headers" 
*Name of record* *alias of record* *value of record* 

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

Любые рекомендации о том, как подойти к этому, приветствуются. Я никогда не читал в файле этот комплекс, поэтому я не знаю, как подойти, игнорируя много информации, пытаясь получить другую информацию для базы данных. Также значение компонента, которое я пытаюсь собрать, всегда следует за компонентом слова в строке, начинающейся с «srvrmgr».

«*» представляет области, которые будут помещены в базу данных.

Siebel Enterprise Applications Siebel Server Manager, Version 8.1.1.11 [23030] LANG_INDEPENDENT 
Copyright (c) 1994-2012, Oracle. All rights reserved. 

The Programs (which include both the software and documentation) contain 
proprietary information; they are provided under a license agreement  containing 
restrictions on use and disclosure and are also protected by copyright, patent, 
and other intellectual and industrial property laws. Reverse engineering, 
disassembly, or decompilation of the Programs, except to the extent required to 
obtain interoperability with other independently created software or as specified 
by law, is prohibited. 

Oracle, JD Edwards, PeopleSoft, and Siebel are registered trademarks of 
Oracle Corporation and/or its affiliates. Other names may be trademarks 
of their respective owners. 

If you have received this software in error, please notify Oracle Corporation 
immediately at 1.800.ORACLE1. 

Type "help" for list of commands, "help <topic>" for detailed help 

Connected to 1 server(s) out of a total of 1 server(s) in the enterprise 

srvrmgr> configure list parameters show PA_NAME,PA_ALIAS,PA_VALUE 

srvrmgr> 

srvrmgr> list parameters for component ADMBatchProc 

PA_NAME                  PA_ALIAS        PA_VALUE                                                               
---------------------------------------------------------------------- ------------------------------------- -------------------------------------------------------------------------------------------------------------------- 
ADM Data Type Name               ADMDataType                                                                        
ADM EAI Method Name               ADMEAIMethod       Upsert                                                                
ADM Deployment Filter              ADMFilter  

213 rows returned. 

srvrmgr> list parameters for component ADMObjMgr_enu 

PA_NAME                 PA_ALIAS        PA_VALUE                                                               
---------------------------------------------------------------------- ------------------------------------- -------------------------------------------------------------------------------------------------------------------- 
AccessibleEnhanced              AccessibleEnhanced      False          

Это начало текстового файла. Он создан в системе под названием Siebel, чтобы показать все настройки для этой среды. Мне нужно вытащить имя компонента (в текущем файле несколько экземпляров, но показаны здесь «ADMBatchProc» и «ADMObjMgr_enu»), а затем данные, показанные в таблице ниже, которые были созданы Siebel. Остальная часть информации не имеет значения для цели, в которой я нуждаюсь.

+3

Я не нашел объяснения очень ясным, не могли бы вы привести конкретный пример, показывая, что вы имеете в виду под колоннами, компонентами ...? – Veverke

ответ

0

Вы хотите, чтобы прочитать текстовый файл с помощью StreamReader:

using (FileStream fileStream = File.OpenRead(path)) 
{ 
    byte[] data = new byte[fileStream.Length]; 
    for (int index = 0; index < fileStream.Length; index++) 
    { 
     data[index] = (byte)fileStream.ReadByte(); 
    } 
    Console.WriteLine(Encoding.UTF8.GetString(data)); // Displays: your file - now you can decide how to manipulate it. 
} 

Может быть, тогда вы будете использовать Regex захватить дату вы хотели бы вставить:

Вы можете вставить в db следующим образом:

using (TransactionScope transactionScope = new TransactionScope()) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     connection.Open(); 
     SqlCommand command1 = new SqlCommand(
     “INSERT INTO People ([FirstName], [LastName], [MiddleInitial]) 
     VALUES(‘John’, ‘Doe’, null)”, 
     connection); 
     SqlCommand command2 = new SqlCommand(
     “INSERT INTO People ([FirstName], [LastName], [MiddleInitial]) 
     VALUES(‘Jane’, ‘Doe’, null)”, 
     connection); 
     command1.ExecuteNonQuery(); 
     command2.ExecuteNonQuery(); 
    } 
    transactionScope.Complete(); 
} 

Примеры, адаптированные из C# 70-483 от Wouter de Kort.

1

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

Попробуйте это:

1) Создайте интерфейс, который будет представлять данные операции или разбор логики вы ожидаете приложение для выполнения. Например:

2) Соберите как можно больше небольших примеров дискретных входов, которые имеют четкое поведение.

3) Внесите обработчик поведения в свой парсер. Например:

public class Parser { 
    private const string COMPONENT_MARKER = "srvrmgr"; 
    private readonly IParserBehaviors _behaviors; 
    public Parser(IParserBehaviors behaviors) { 
     _behaviors = behaviors; 
    } 
    public void ReadFile(string filename) { 
     // bla bla 
     foreach (string line in linesOfFile) { 
      // maintain some state 
      if (line.StartsWith(COMPONENT_MARKER)) { 
       DataTable table = _behaviors.ProduceTableForCurrentComponent(); 
       // save table to the database 
       _behaviors.StartNextComponent(); 
      } 
      else if (/* condition */) { 
       // parse some text 
       _behaviors.LoadNewDataRow(values); 
      } 
     } 
    } 
} 

4) Создайте тесты вокруг ожидаемого поведения, используя ваш предпочтительный издевательский фреймворк. Например:

public void FileWithTwoComponents_StartsTwoNewComponents() { 
    string filename = "twocomponents.log"; 
    Mock<IParserBehaviors> mockBehaviors = new Mock<IParserBehaviors>(); 
    Parser parser = new Parser(mockBehaviors.Object); 

    parser.ReadFile(filename); 

    mockBehaviors.Verify(mock => mock.StartNextComponent(), Times.Exactly(2)); 
} 

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