2015-01-20 4 views
1

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

Как я могу проанализировать имя файла строки в нескольких переменных?

EX Файлы:

2014_31_12_09_36AM_15555555555_108

2014_31_12_09_39AM_108_15555555555

2014_31_12_09_17AM_102_108

Имя файла содержит год, день, месяц, час, минуты (с AM/PM), и 3-значный или 11-значный номер, за которым следует еще 3 или 11-значный номер

Все имена файлов хранятся в массиве после сканирования каталога.

private void ParseFileNames() 
    { 
     string Year = ""; 
     string Day = ""; 
     string Month = ""; 
     string Hour = ""; 
     string Minute = ""; 
     string Called = ""; 
     string Calling = ""; 

     //Loop through scanned file names and parse them one at a time. 
     for (int i = 0; i < fileNames.Length; i++) 
     { 
      string[] parsedFileName = fileNames[i].Split('_'); 
      Year = parsedFileName[0]; 
      Day = parsedFileName[1]; 
      Month = parsedFileName[2]; 
      Hour = parsedFileName[3]; 
      Minute = parsedFileName[4]; 
      Called = parsedFileName[5]; 
      Calling = parsedFileName[6]; 

      //open DB connection and submit each individual parsed file data into DB 

      //Move file from toIndexPath to IndexedPath 
     } 
    } 

Есть ли лучший способ сделать это?

+0

«Лучше» как? Способный обрабатывать неверно названные имена? Хранение дат как даты вместо строк? Использование меньшего количества символов? –

+0

Я планирую преобразовать дату в дату вместо строки, а также время (отдельно от даты?), Чтобы их можно было искать. – Meta

ответ

0

вы могли бы возвращать класс, как это

public class FileData 
{ 
    public int Year {get;set;} 
    public int Day {get;set;} 
    public int Month {get;set;} 
    public int Hour {get;set;} 
    public int Minute {get;set;} 
    public int Called {get;set;} 
    public int Calling {get;set;} 

    public FileData(string[] parsedInfo) 
    { 
     Year = Convert.ToInt32(parsedInfo[0]); 
     // and so on with other member to load 
    } 
} 

затем просто вызовите следующее, чтобы получить List<FileData>:

var listFileData = fileNames.Select(fn=> new FileData(fn.Split('_'))).ToList(); 
0

Этот код короче, я не знаю, о лучше, но, по крайней мере, вам получить Date Time

//This code is just for testing the strings, delete these 4 after testing. 
    var stringList = new List<string>(); 
    stringList.Add("2014_31_12_09_36AM_15555555555_108"); 
    stringList.Add("2014_31_12_09_39AM_108_15555555555"); 
    stringList.Add("2014_31_12_09_17AM_102_108"); 

    var allFileDate = new List<FileData>(); 
    foreach (var item in stringList) 
    { 
     var dt = item.Split('_'); 
     var timeCombined = string.Concat(dt[2], "/", dt[1],"/", dt[0]," ", dt[3], ":", dt[4]); 
     allFileDate.Add(new FileData {Date = Convert.ToDateTime(timeCombined), Called = dt[5], Calling = dt[6]}); 
    } 

И ваш класс

public class FileData 
    { 
     public DateTime Date { get; set; } 
     public string Called { get; set; } 
     public string Calling { get; set; }  
    } 

Все данные проверяются там, и все в порядке.

0

Есть ли лучший способ сделать это?

«лучше» довольно субъективно. всегда есть лучший способ в зависимости от того, что вы хотите. В вашем случае я бы не писал код для анализа ваших имен файлов, и вы бы делали много круговых поездок, чтобы заполнить таблицу по одной строке за раз.

Я бы вместо этого просто использовать команду массовой загрузки, например .: LOAD DATA ... INTO TABLE ... LINES TERMINATED BY '\r\n' FIELDS TERMINATED BY '_'

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