2015-11-16 54 views
0

我需要将任何平面分隔文件转换为管道分隔格式。我将这个控制台应用程序编写为POC,但它试图编写的第二个文件将包含第一个文件中的所有文本。有什么建议么?阅读,操作和编写文本文件C#

 string sourceDir = @"c:\temp\"; 
     string targetDir = @"c:\dest\"; 

     List<string> listLines = new List<string>(); 

     string[] files = Directory.GetFiles(sourceDir); 

     foreach(string file in files) 
     { 
      using (StreamReader sr = new StreamReader(sourceDir + Path.GetFileName(file))) 
      { 
       do 
       { 
        listLines.Add(sr.ReadLine()); 
       } while (!sr.EndOfStream); 

       for (int i = 0; i < listLines.Count; i++) 
       { 
        listLines[i] = listLines[i].Replace(',', '|'); 
        listLines[i] = listLines[i].Replace('\t', '|');       
       }           
      } 

      using (StreamWriter sw = new StreamWriter(targetDir + Path.GetFileName(file))) 
      { 
       foreach (string line in listLines) 
       { 
        sw.WriteLine(line); 
       }   
      } 
     } 
+3

您正在将行添加到listLines中,并且从不在foreach迭代后清除列表。 –

回答

1

你添加一些行来listLines从不清除的foreach迭代后的列表。

通过@Jonathan Carroll

除此之外,你可以提高你的代码是:

string sourceDir = @"c:\temp\"; 
string targetDir = @"c:\dest\"; 

List<string> listLines = new List<string>(); 

string[] files = Directory.GetFiles(sourceDir); 

foreach (string file in files) 
{ 
    using (StreamReader sr = new StreamReader(sourceDir + Path.GetFileName(file))) 
    using (StreamWriter sw = new StreamWriter(targetDir + Path.GetFileName(file))) 
    { 
     do 
     { 
      var line = sr.ReadLine(); 

      line = line.Replace(',', '|').Replace('\t', '|'); 

      sw.WriteLine(line); 

     } while (!sr.EndOfStream); 
    } 
} 
+0

非常干净优雅,我喜欢。可以放弃列入'List listLines',因为它甚至没有用到这个解决方案。我认为这只是从复制粘贴中剩下的;) – sab669

1

您需要可以移动listLines的实例进入的foreach,或重新初始化在列表循环的结尾。

string sourceDir = @"c:\temp\"; 
    string targetDir = @"c:\dest\"; 

    string[] files = Directory.GetFiles(sourceDir); 

    foreach(string file in files) 
    { 
     List<string> listLines = new List<string>(); 
     using (StreamReader sr = new StreamReader(sourceDir + Path.GetFileName(file))) 
     { 
      do 
      { 
       listLines.Add(sr.ReadLine()); 
      } while (!sr.EndOfStream); 

      for (int i = 0; i < listLines.Count; i++) 
      { 
       listLines[i] = listLines[i].Replace(',', '|'); 
       listLines[i] = listLines[i].Replace('\t', '|');       
      }           
     } 

     using (StreamWriter sw = new StreamWriter(targetDir + Path.GetFileName(file))) 
     { 
      foreach (string line in listLines) 
      { 
       sw.WriteLine(line); 
      }   
     } 
    } 
0

我要说的是,其他的答案是相当清晰的,只是想我会使用LINQ和正则表达式在很短的替代解决方案抛出:

foreach (var file in Directory.GetFiles(sourceDir).Select(x => Path.GetFileName(x))) 
    File.WriteAllText(targetDir + file, new Regex("[,\t]").Replace(File.ReadAllText(sourceDir + file), "|")); 

的LINQ查询选择用于将完整路径转换为文件名 - 然后迭代这个文件名集合。 正则表达式用于匹配从源文件读取的所有','和'\ t'字符,并用'|'替换它们。字符。这个结果字符串被写入目标文件。