如何阅读在文本文件中的某一行?(How do I read a specified line in

2019-06-18 08:42发布

给定一个文本文件,我怎么会去读取文件中的任意直线,没有别的?

我说,我有一个文件test.txt。 我怎么会去有关文件阅读行号15?

所有我所看到的是,涉及存储整个文本文件作为一个String数组,然后使用该行号作为字符串从数组使用的数量值的东西......但也有一些并发症:文本档案巨大巨大的,我正在应用程序编码是不完全是一个顶尖的系统的机器。 速度不是最优先考虑,但绝对是一个重大问题。

有没有什么方法可以读取文本文件的特定行,并将结果保存为一个字符串?

感谢您的答复:该文件是有点儿结构。 它有25行信息,然后数字X线,但第25行17 X的值。

但随后,有1个空白行,它重演遍布作为第二记录在文件中和X可以为每个记录的值不同。

我想要做的就是读取和存储第一25行作为独立的值,然后存储下一个X(通常约为250)行作为数组什么。 然后,我要存储在一个SQL数据库,并与下一个记录重复,直到我到达第y记录(记录在文件中的数字是3号线)

编辑2:好了,我想我已经得到了基于你承滴盘响应的组合的解决方案。

我要读第25行,并将其存储为一个数组。 我会复制阵列局部变量的相关内容,然后我会删除第25行。 然后,我可以使用信息,以存储下一个X线(第13项的数组中的值)作为数组,序列化,它存储在数据库中,然后删除我刚才读的行。

然后我可以重复上述过程,每个后续记录。

当然,这依赖于一个假设我在做,这是诚实的,我不知道是真的。 是否可以删除一个文本文件在C#中的第n行,而不必读取整个事情,它重新编写没有第n行?

Answer 1:

.NET 4.0编辑

由于.NET 4.0,可以直接访问文件的单行。 例如,访问15行:

string line = File.ReadLines(FileName).Skip(14).Take(1).First();

这将只返回所需的行


既然你无法预测的位置(可以吗?)的文件中第i行,你必须读取所有先前行了。 如果行号小,这可以比更有效ReadAllLines方法。

string GetLine(string fileName, int line)
{
   using (var sr = new StreamReader(fileName)) {
       for (int i = 1; i < line; i++)
          sr.ReadLine();
       return sr.ReadLine();
   }
}


Answer 2:

如果每一行是一个固定长度的,那么你可以打开一个流周围,寻求(每行字节)* N到该文件,并从那里读您的线路。

using( Stream stream = File.Open(fileName, FileMode.Open) )
{
    stream.Seek(bytesPerLine * (myLine - 1), SeekOrigin.Begin);
    using( StreamReader reader = new StreamReader(stream) )
    {
        string line = reader.ReadLine();
    }
}

或者你可以只使用StreamReader,直到你找到你想要的人读线。 这样会比较慢,但仍然在阅读每一行的改善。

using( Stream stream = File.Open(fileName, FileMode.Open) )
{
    using( StreamReader reader = new StreamReader(fileStream) )
    {
        string line = null;
        for( int i = 0; i < myLineNumber; ++i )
        {
            line = reader.ReadLine();
        }
    }
}


Answer 3:

没有很不幸,没有。 在原级的文件没有行号的基础上工作。 相反,他们在一个位置/偏移基础工作。 根文件系统有没有行的概念。 这是由更高级别的组件添加的概念。

因此,有没有办法告诉操作系统,请在行等等打开文件。 相反,你必须打开该文件,并跳过周围计数新行,直到你已经通过了指定数量。 然后下一组的字节存储到一个数组,直到你遇到下一个新行。



Answer 4:

除非你有固定大小的线,你需要阅读每一行,直到你达到你想要的行。 虽然,你并不需要存储的每一行,就放弃它,如果它不是你想要的线路。

编辑:

如前所述,它也可能在文件中寻找,如果线路长度是可以预测的 - 也就是说,你可以应用一些确定性函数变换行号插入文件的位置。



Answer 5:

作为迈赫达德说,你不能只寻求到第n行而不读取文件。 不过,你不需要在内存中存储的整个文件 - 只需放弃你不需要的数据。

string line;
using (StreamReader sr = new StreamReader(path))
    for (int i = 0; i<15; i++)
    {
       line = sr.ReadLine();
       if (line==null) break; // there are less than 15 lines in the file
    }


Answer 6:

读五线每一次,只要把你的声明,如果声明,这就是它

        String str1 = @"C:\Users\TEMP\Desktop\StaN.txt";   

        System.IO.StreamReader file = new System.IO.StreamReader(str1);

        line = file.ReadLine();

        Int32 ctn=0;

        try
        {

            while ((line = file.ReadLine()) != null)
            {

                    if (Counter == ctn)
                    {
                        MessageBox.Show("I am here");
                        ctn=ctn+5;
                        continue;
                    }
                    else
                    {
                        Counter++;
                        //MessageBox.Show(Counter.ToString());
                        MessageBox.Show(line.ToString());
                    } 
                }

            file.Close();
        }
        catch (Exception er)
        {

        }


Answer 7:

如果行所有固定长度,你可以使用流的Seek方法移动到正确的起始positiion。

如果行是一个可变长度的你的选择是有限的。

如果这仅仅是使用一次,然后丢弃你将是一个文件,那么你最好关闭在阅读和memeory与它一起工作。

如果这是你将保持,并将从多个读取比写入一个文件,你可以创建一个包含每一行的起始位置自定义索引文件。 然后使用该索引,让您的搜索位置。 创建索引文件的过程是资源密集型的。 每次你添加一个新行到你需要更新索引文件,因此维修成为一个不平凡的问题。



Answer 8:

你可以逐行读取,这样你就不用看了整个一次性(可能的话)

int i=0
while(!stream.eof() && i!=lineNum)
    stream.readLine()
    i++
line = stream.readLine()


Answer 9:

如果文件包含具有不同长度的线,你需要经常阅读线,你需要快速地阅读它,你可以通过一次读它使文件的索引,保存每个新行的位置,然后当你需要读取一行,你只是查找索引中的线的位置,寻找那里,然后你看行。

如果要添加新行的文件,你可以再补充新线指标和你不需要重新索引所有。 但如果你的文件中的行某处变化,你已经索引,那么你必须重新索引。



Answer 10:

虽然你不能在一个非对称的文件直接寻求N行,而不在该文件中读取数据(因为你需要计算你有多少行进展到该文件),你可以指望换行直到你到达你想行这需要最少内存量,可能有最好的表现。

这将是更多的内存比阅读一切到一个数组有效,因为它只会读入文件,直到它遇到文件或行号(以先到者为准)结束。 它远非完美,但很可能会满足您的需求:

string line15 = ReadLine(@"C:\File.csv", 15);

public string ReadLine(string FilePath, int LineNumber){
    string result = "";
    try{
    if( File.Exists(FilePath) ){
        using (StreamReader _StreamReader = new StreamReader(FilePath)){
        for (int a = 0; a < LineNumber; a++) {
            result = _StreamReader.ReadLine();
        }
        }
    }
    }catch{}
    return result;
}


Answer 11:

屡试不爽。 如此简单如下:

string line = File.ReadLines(filePath).ElementAt(actualLineNumber - 1);

只要你有一个文本文件,这应该工作。 后来,这取决于你希望读什么数据,你可以相应地施放字符串,并使用它。



Answer 12:

的变化。 如果行数大于行数大于产生错误。

string GetLine(string fileName, int lineNum)
{
    using (StreamReader sr = new StreamReader(fileName))
    {
        string line;
        int count = 1;
        while ((line = sr.ReadLine()) != null)
        {
            if(count == lineNum)
            {
                return line;
            }
            count++;
        }
    }
    return "line number is bigger than number of lines";  
}


Answer 13:

        if (File.Exists(fpath))
        {

            var data = File.ReadLines(fpath);
            Console.WriteLine(data.ToArray()[14]);
        }


Answer 14:

迟到的回答,但值得。

需要加载,其中每个线路将被分配到索引在数组或列表对象的线条,然后简单地通过他们的指数调用线中的任意范围for循环。

解决方案是相当不错的,但有一个内存消耗之间。

给它尝试...它值得



文章来源: How do I read a specified line in a text file?