有没有办法忽略文本文件中某些行的阅读?

时间:2010-09-15 13:34:39

标签: c# ignore lines

我正在尝试读取c#应用程序中的文本文件,但我不想读取前两行或最后一行。文件中有8行,所以有效地我只想阅读第3,第4,第5,第6和第7行。 有没有办法做到这一点?

示例文件

USE [雪莱的其他数据库]
CREATE TABLE db.exmpcustomers(
fName varchar(100)NULL,
lName varchar(100)NULL,
dateOfBirth日期为NULL,
houseNumber int NULL,
streetName varchar(100)NULL
)ON [PRIMARY]

编辑

好的,所以,我已经将Callum Rogers的答案应用到我的代码中,并且出于某种原因,它适用于我编辑的文本文件(我创建了一个文本文件,其中包含我不想省略的行),它确切地说它应该是什么,但每当我用原始文本文件(上面)尝试它时,它会引发异常。我在DataGrid中显示此信息,我认为这是抛出异常的地方。

有什么想法吗?

7 个答案:

答案 0 :(得分:9)

罗杰斯的答案很好,我只是提供了另一种方法。 试试这个,

List<string> list = new List<string>();
using (StreamReader reader = new StreamReader(FilePath))
{
    string text = "";
    while ((text = reader.ReadLine()) != null)
    {
        list.Add(text);
    }
    list.RemoveAt(0);
    list.RemoveAt(0);
 }

希望这有帮助

答案 1 :(得分:8)

为什么不使用File.ReadAllLines()然后删除前2行和最后一行?如此小的文件速度差异将不会明显。

string[] allLines = File.ReadAllLines("file.ext");
string[] linesWanted = new string[allLines.Length-3];
Array.Copy(allLines, 2, linesWanted, 0, allLines.Length-3);

答案 2 :(得分:8)

为什么你想要完全忽略前两行和最后一行?

根据您的文件的样子,您可能想要分析该行,例如查看第一个字符是否是注释符号,或忽略所有内容,直到找到第一个空行等等。

有时,硬编码“魔法”数字并不是一个好主意。如果需要将文件格式更改为包含3个标题行怎么办?

正如其他答案所示:没有什么可以阻止你用你读过的一行做你想做的事情,当然,你也可以忽略它。

编辑,现在您已经提供了一个文件示例:对于您的情况,我绝对 使用硬编码的数字做法。如果有一天SQL语句应该包含另一个字段,或者它出现在一个字段而不是8行上,那该怎么办?

我的建议:立即读入整个字符串,然后分析它。最安全的方法是use a grammar,但是如果你假设SQL语句永远不会更复杂,你可以使用正则表达式(仍然比使用行号等更好):

string content = File.ReadAllText(filename);
Regex r = new Regex(@"CREATE TABLE [^\(]+\((.*)\) ON");
string whatYouWant = r.Match(content).Groups[0].Value;

答案 3 :(得分:2)

如果你有一个包裹文件流的TextReader对象,你只需拨打ReadLine()两次。

StreamReader继承自TextReader,这是抽象的。

非傻瓜证明示例:

using (var fs = new FileStream("blah", FileMode.Open))
using (var reader = new StreamReader(fs))
{
    reader.ReadLine();
    reader.ReadLine();

    // Do stuff.
}

答案 4 :(得分:0)

你可以这样做:

var valid = new int[] { 3, 4, 5, 6, 7 };
var lines = File.ReadAllLines("file.txt").
    Where((line, index) => valid.Contains(index + 1));

或相反:

var invalid = new int[] { 1, 2, 8 };
var lines = File.ReadAllLines("file.txt").
    Where((line, index) => !invalid.Contains(index + 1));

如果您正在寻找删除最后一个和第一个2的一般方法,可以使用:

var allLines = File.ReadAllLines("file.txt");
var lines = allLines
  .Take(allLines.Length - 1)
  .Skip(2);

但是从你的例子来看,你最好还是寻找你想要从文件中读取的字符串模式。尝试使用正则表达式。

答案 5 :(得分:0)

string filepath = @"C:\whatever.txt";
using (StreamReader rdr = new StreamReader(filepath))
{
    rdr.ReadLine();  // ignore 1st line
    rdr.ReadLine();  // ignore 2nd line
    string fileContents = "";
    while (true)
    {
        string line = rdr.ReadLine();
        if (rdr.EndOfStream)
            break;  // finish without processing last line
        fileContents += line + @"\r\n";
    }
    Console.WriteLine(fileContents);
}

答案 6 :(得分:0)

一般解决方案怎么样?

对我而言,第一步是枚举文件的行(已由ReadAllLines提供,但由于填充整个string[]数组而导致性能成本;还有{{ 3}},但这只能在.NET 4.0中使用。)

实现这一点非常简单:

public static IEnumerable<string> EnumerateLines(this FileInfo file)
{
    using (var reader = file.OpenText())
    {
        while (!reader.EndOfStream)
        {
            yield return reader.ReadLine();
        }
    }
}

下一步是简单地跳过这个可枚举序列的前两行。使用ReadLines扩展方法很简单。

最后一步是忽略可枚举序列的最后一行。以下是实现此目的的一种方法:

public static IEnumerable<T> IgnoreLast<T>(this IEnumerable<T> source, int ignoreCount)
{
    if (ignoreCount < 0)
    {
        throw new ArgumentOutOfRangeException("ignoreCount");
    }

    var buffer = new Queue<T>();
    foreach (T value in source)
    {
        if (buffer.Count < ignoreCount)
        {
            buffer.Enqueue(value);
            continue;
        }

        T buffered = buffer.Dequeue();

        buffer.Enqueue(value);

        yield return buffered;
    }
}

好的,那么。总而言之,我们有:

var file = new FileInfo(@"path\to\file.txt");
var lines = file.EnumerateLines().Skip(2).IgnoreLast(1);

测试输入(文件内容):

This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
This is line number 5.
This is line number 6.
This is line number 7.
This is line number 8.
This is line number 9.
This is line number 10.

输出(Skip(2).IgnoreLast(1)):

This is line number 3.
This is line number 4.
This is line number 5.
This is line number 6.
This is line number 7.
This is line number 8.
This is line number 9.