C#:读取由附加换行符分隔的文本文件

时间:2014-05-15 17:41:32

标签: c# file-io

我有一些sql命令被一个额外的换行符分隔开来:

ALTER TABLE XXX
ALTER COLUMN xxx real

ALTER TABLE YYY
ALTER COLUMN yyy real

ALTER TABLE ZZZ
ALTER COLUMN zzz real

我尝试使用一系列字符分隔符来读取文件,如下所示

new char[] { '\n', '\r'}

在这个方法中:

    private static List<string> ReadFile(string FileName, char[] seps)
    {
        if (!File.Exists(FileName))
        {
            Console.WriteLine("File not found");
            return null;
        }

        using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
        {
            string content = sr.ReadToEnd();
            return content.Split(seps, StringSplitOptions.RemoveEmptyEntries).ToList();
        }
    }

然而,这似乎并没有起作用。我想让每个命令由一个单独的字符串表示。我怎么能这样做?

5 个答案:

答案 0 :(得分:3)

为什么不使用File.ReadAllLines()

private static List<string> ReadFile(string FileName)
{
    if (!File.Exists(FileName))
    {
        Console.WriteLine("File not found");
        return null;
    }

    var lines = File.ReadAllLines(FileName);
    return lines.ToList();
}

这将自动按换行符读取和拆分文件。

如果要过滤掉空行,请执行以下操作:

var nonEmpty = ReadFile(path).Where(x => !string.IsNullOrEmpty(x)).ToList();

旁注,如果找不到文件,我会更改你的if语句抛出异常。

if (!File.Exists(FileName))
{
    throw new FileNotFoundException("Can't find file");
}

答案 1 :(得分:1)

您可以过滤示例。当我读到它们时,空行的长度为1,其char值由于某种原因表示为131。所以我只是按长度过滤&gt; 1

void Main()

{     var results = ReadFile(@&#34; C:\ temp \ sql.txt&#34;,new char [] {&#39; \ n&#39;});     Console.WriteLine(results.Count);     foreach(结果中的结果)     {         Console.WriteLine(结果);     } }

private static List<string> ReadFile(string FileName, char[] seps)
{
    if (!File.Exists(FileName))
    {
        Console.WriteLine("File not found");
        return null;
    }

    using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
    {
        string content = sr.ReadToEnd();
        return content.Split(seps, StringSplitOptions.RemoveEmptyEntries).Where (c => c.Length > 1).ToList();
    }
}

答案 2 :(得分:1)

试试这个:

private static List<string> ReadFile(string FileName)
  {
      List<string> commands = new List<string>();
      StringBuilder command = new StringBuilder();

      if (!File.Exists(FileName))
      {
          Console.WriteLine("File not found");
          return null;
      }

      foreach (var line in File.ReadLines(FileName))
      {
          if (!String.IsNullOrEmpty(line))
          {
              command.Append(line + "\n");
          }
          else
          {
              commands.Add(command.ToString());
              command.Clear();
          }
      }
      commands.Add(command.ToString());
      return commands;
  }

答案 3 :(得分:1)

如果你确定你总是有\ r \ n行结尾,你可以使用:

var commands = content.Split(new []{"\r\n\r\n"}, StringSplitOptions.RemoveEmptyEntries);

否则,请尝试使用正则表达式:

var commands = Regex.Split(content, @"\r?\n\r?\n")

答案 4 :(得分:1)

谢谢大家的回答。我最终使用了这个辅助方法:

    private static List<string> GetCommands(string location)
    {
        List<string> ret = new List<string>();
        List<string> tmp = ReadFile(location, new string[] { "\r\n\r\n"});

        for (int i = 0; i < tmp.Count; i++)
        {
            string rem = tmp[i].Replace("\r", "");
            ret.Add(rem);
        }
        return ret;
    }

顺便说一下,Python中的等价物要容易得多。例如,我正在尝试做的事情可以用以下三行来表达:

with open('commands.txt', 'r') as f:
    content  = f.read()
    commands = [ command for command in content.split('\n\n') ]