如何读取文本文件中一行的一部分?

时间:2020-05-31 00:00:55

标签: c#

所以,我有一个文本文件,其中包含成千上万行,其格式与此类似:

template <typename T> bool get_vector(const std::size_t index, const results_context_t& results, std::vector<T>& v) { ... }

这些文件的长度几乎总是不同,我只需要读取该行的前两部分,即123456:0.8525000:1590882780:91011

我知道我可以使用C#分割每一行,但是我不确定如何只读取前两部分。有人对如何执行此操作有任何想法吗?抱歉,如果我的问题没有道理,可以在需要时重述。

3 个答案:

答案 0 :(得分:2)

name函数返回scratch.rkt> (define bday-list (list (birthday 'sam 25 'april) (birthday 'erin 15 'april) (birthday 'james 3 'april) (birthday 'randi 7 'april))) scratch.rkt> (bdayRange 6 17 bday-list) '(erin randi) flutter create -i swift .的数组。

只需将Split的结果的前两个元素(以string[]作为分隔符)即可。

string

.NET Fiddle

请不要忘记Split的元素是:而不是 var read = "123456:0.8525000:1590882780:91011"; var values = read.Split(":"); Console.WriteLine(values[0]); // 123456 Console.WriteLine(values[1]); // 0.8525000 values的值。有关如何从字符串转换为数字类型的信息,请参见How to convert string to integer in C#

答案 1 :(得分:0)

有很多方法可以做到这一点,但是我将建议一些涉及阅读整行的选项,因为它更易于使用/理解,并且您的行长不一。我确实在附录的末尾添加了关于在文件上使用StreamReader的建议,但是您可能需要弄清楚跳过不需要的行,在新行上重新启动char迭代循环等的认真工作。

我首先演示在NetCore 3.x中发现的最新,最出色的IAsyncEnumerable,然后介绍类似的基于字符串的方法。通过分享一个稍微先进且也将异步的Int示例,我希望在2020年也能帮助其他人并演示一种相当现代的方法。仅流出所需的数据将对保持数据的快速性和可用性具有巨大的好处。低内存占用。

public static async IAsyncEnumerable<int> StreamFileOutAsIntsAsync(string filePathName)
{
    if (string.IsNullOrWhiteSpace(filePathName)) throw new ArgumentNullException(nameof(filePathName));
    if (!File.Exists(filePathName)) throw new ArgumentException($"{filePathName} is not a valid file path.");

    using var streamReader = File.OpenText(filePathName);
    string currentLine;

    while ((currentLine = await streamReader.ReadLineAsync().ConfigureAwait(false)) != null)
    {
        if (int.TryParse(currentLine.AsSpan(), out var output))
        {
            yield return output;
        }
    }
}

这会将每个int流式传输到文件之外,检查文件是否存在以及文件名路径是否为null或空白等。

对于初学者来说,流媒体可能太多了,所以我不知道您的水平。

您可能希望首先将文件转换为字符串列表。

将我上面的示例修改为不太复杂,但可以为您拆分字符串。我建议您学习有关流的知识,这样在您进行处理时就不会在内存中存储所有字符串了……或者您可能想要全部。我不是来这里评判的。

一旦从文件中获取字符串行,您就可以执行其他需要完成的工作。

public static async Task<List<string>> GetStringsFromFileAsync(string filePathName)
{
    if (string.IsNullOrWhiteSpace(filePathName)) throw new ArgumentNullException(nameof(filePathName));
    if (!File.Exists(filePathName)) throw new ArgumentException($"{filePathName} is not a valid file path.");

    using var streamReader = File.OpenText(filePathName);

    string currentLine;
    var strings = new List<string>();

    while ((currentLine = await streamReader.ReadLineAsync().ConfigureAwait(false)) != null)
    {
        var lineAsArray = currentLine.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);

        // Simple Data Validation
        if (lineAsArray.Length == 4)
        {
            strings.Add($"{lineAsArray[0]}:{lineAsArray[1]}");
            strings.Add($"{lineAsArray[2]}:{lineAsArray[3]}");
        }
    }

    return strings;
}

代码的内容真的很简单,打开文件以供阅读!

using var streamReader = File.OpenText(filePathName);

然后遍历该文件...

while ((currentLine = await streamReader.ReadLineAsync()) != null)
{
    var lineAsArray = currentLine.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);

    // Simple Data Validation
    if (lineAsArray.Length == 4)
    {
        // Do whatever you need to do with the first bits of information.
        // In this case, we add them all to a list for return.
        strings.Add($"{lineAsArray[0]}:{lineAsArray[1]}");
        strings.Add($"{lineAsArray[2]}:{lineAsArray[3]}");
    }
}

这说明,对于我读出的不为空的每一行,请分成四个部分(基于“:”)字符,以删除所有空条目。

然后,我们使用一种称为String Interpolation($"")的C#功能,将前两个字符与“:”放回字符串中。然后是第二个。或者您需要阅读该行的每一部分。

这实际上就是全部!希望对您有所帮助。

附录:如果您确实需要读取文件的某些部分,请使用StreamReader.Read和Peek()

using (var sr = new StreamReader(path))
{
    while (sr.Peek() >= 0)
    {
        Console.Write((char)sr.Read());
    }
}

Reading each character

答案 2 :(得分:0)

一些裸露的代码:

string fileName = @"c:\some folder\path\file.txt";
using (StreamReader sr = new StreamReader(fileName))
{
    while (!sr.EndOfStream)
    {
        String[] values = sr.ReadLine().Split(":".ToCharArray());
        if (values.Length >= 2)
        {
            // ... do something with values[0] and values[1] ...
            Console.WriteLine(values[0] + ", " + values[1]);
        }
    }
}
相关问题