2016-01-31 22 views
0

我目前正在研究一个小项目,它根据条件从'txt'文件返回文本,然后在将它导出到数据库之前进行分组。在文本文件中,我有:用C#中的文本文件对数据进行分组

C:\测试\ 123

其他线路...

C:\测试\ 124

问题: “错误的说明”。 (这个错误是针对目录124的)

问题:“错误描述”。 (此错误是目录124)

C:\测试\ 125

...

我想组“问题”,以及其相关的目录其导入到数据库时。到目前为止,我已经尝试使用'foreach'来返回行所在的行/开头的目录或问题。尽管这会传递值,但用户不清楚问题属于哪个目录。理想的情况是我后:

目录(列1)问题(列2)

C:\测试\ 123 || Null

c:\ test \ 124 ||问题:“错误描述”。

c:\ test \ 124 ||问题:“错误描述”。

c:\ test \ 125 ||空

任何帮助,你可以给予将不胜感激。上周我一直在绞尽脑汁!

(当前代码)

 var lines = File.ReadAllLines(filename); 

     foreach (var line in File.ReadLines(filename)) 
     { 
      String stringTest = line; 

      if (stringTest.Contains(directory)) 
      { 
       String test = stringTest; 

       var csb = new SqlConnectionStringBuilder(); 
       csb.DataSource = host; 
       csb.InitialCatalog = catalog; 
       csb.UserID = user; 
       csb.Password = pass; 

       using (var sc = new SqlConnection(csb.ConnectionString)) 
       using (var cmd = sc.CreateCommand()) 
       { 
        sc.Open(); 
        cmd.CommandText = "DELETE FROM table"; 
        cmd.CommandText = "INSERT INTO table (ID, Directory) values (NEWID(), @val)"; 
        cmd.Parameters.AddWithValue("@VAL", test); 
        cmd.ExecuteNonQuery(); 
        sc.Close(); 
       } 
      } 

      if (stringTest.Contains(problem)) 
      { 

同为问题....

+0

因此,您只考虑以“问题”开头的行吗? –

+0

我是的。文件中还有其他行,但我专注于在每个目录条目后返回问题行。 – Floyd

+0

发布你现在使用的代码会很有用,可以节省其他时间来提示你已经试过并丢弃的东西。 – Tim

回答

1

这里是一个解决方案:

假设你有下面的类来保存结果项目:

public class ResultItem 
{ 
    public string Directory { get; set; } 
    public string Problem { get; set; } 
} 

您可以执行以下操作:

var lines = File.ReadAllLines(filename); 

string current_directory = null; 

List<ResultItem> results = new List<ResultItem>(); 

//maintain the number of results added for the current directory 
int problems_added_for_current_directory = 0; 

foreach (var line in lines) 
{ 
    if (line.StartsWith("c:\\test")) 
    { 
     //If we are changing to a new directory 
     //And we didn't add any items for current directory 
     //Add a null result item 
     if (current_directory != null && problems_added_for_current_directory == 0) 
     { 
      results.Add(new ResultItem 
      { 
       Directory = current_directory, 
       Problem = null 
      });        
     } 

     current_directory = line; 

     problems_added_for_current_directory = 0; 
    } 
    else if (line.StartsWith("Problem")) 
    { 
     results.Add(new ResultItem 
     { 
      Directory = current_directory, 
      Problem = line 
     }); 

     problems_added_for_current_directory++; 
    } 
} 

//If we are done looping 
//And we didn't add any items for current (last) directory 
//Add a null result item 
if (current_directory != null && problems_added_for_current_directory == 0) 
{ 
    results.Add(new ResultItem 
    { 
     Directory = current_directory, 
     Problem = null 
    }); 
} 
+0

这是一个很好的答案,并产生我所需要的。 – Floyd

+0

不客气。很高兴我能帮上忙。 –

相关问题