【问题标题】:Compare numbers and remove numbers from a text file using C#使用 C# 比较数字并从文本文件中删除数字
【发布时间】:2019-06-07 17:08:46
【问题描述】:

我创建了一个文本文件,其中包含一些从 743.6 到 1500.4 的随机浮点数。 我正在想办法读取文本文件(我已经做过)并包含一个数字范围:假设(743.6

我已经设法编写了一些代码来读取文本文件,以便在编译时显示文本文件中的数字。现在我不知道如何进一步进步。这是我的代码,它能够运行编译。这段代码现在可以读取文本文件了。

743.6

742.8

744.7

743.2

1000

1768.6

1750

1767

1780

1500

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ReadTextFile
{
    class Program
    {
        static void Main(string[] args)
        {
           string filePath = "C:\\Users\\Student\\Desktop\\ConsoleApp1\\ConsoleApp1\\Data\\TextFile.txt"; // File Direcotry

             List<string> lines = File.ReadAllLines(filePath).ToList();

             foreach (string line in lines)
             {
                 Console.WriteLine(line);
             }
             Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 你能分享你的代码吗?
  • 您好,欢迎来到 SO。请查看How to Ask 并尝试让您更清楚地了解您正在努力解决的问题。您最好的方法的minimal reproducible example 也将非常有帮助。另外,请包含您的示例输入文件。
  • 我已经添加了我的代码,请看一下。
  • 文件内容看起来如何?它有多大?
  • 您可以选择切换到纯文本以外的其他格式吗?喜欢 XML 还是 JSON?

标签: c#


【解决方案1】:

这会将文件读入内存、解析、过滤,然后用新数据覆盖现有文件。

File.WriteAllLines(filePath,
    File.ReadAllLines(filePath)
      .Select(x => double.Parse(x))
      .Where(x => x >= 800.5 && x <= 850.5)
      .Select(x => x.ToString()));

【讨论】:

  • 嗨!感谢您的帮助,我可以知道我应该在代码的哪一部分添加它吗?
  • @Kiwi 把它放在你的 main 方法中
【解决方案2】:

由于使用了正则表达式,这是我的解决方案,其中包含基本的错误检测和一些稳健性。 作为前言:使用正则表达式可能会非常昂贵,而且它们并非总是要走的路。

在这种情况下,我认为它们没问题,因为您正在处理用户生成的输入(可能)。 正则表达式可以通过预编译来优化!

/*
    using System;
    using System.IO;
    using System.Text.RegularExpressions;
*/


void ReadFile(string filePath) {
    var fileInfo = default(FileInfo);
    var separator = @"[;\s:,]"; // This is a simple RegEx, can be done otherwise. This allows for a little more robustness IMO

    // VERY rudimentary error detection
    if (string.IsNullOrEmpty(filePath))
        throw new ArgumentNullException(nameof(filePath), "The path to the file must not be null or empty!");

    try {
        fileInfo = new FileInfo(filePath);
    } catch {
        throw new ArgumentException(nameof(filePath), "A valid path must be given!");
    }

    if (!fileInfo.Exists) {
        throw new IOException(string.Format("The file {0} does not exist!", filePath));
    }
    // END VERY rudimentary error checking

    var numberStrings = Regex.Split(File.ReadAllText(fileInfo.FullName), separator);
    // numberStrings is now an array of strings

    foreach (var numString in numberStrings) {
        if (decimal.TryParse(numString, out var myDecimal)) {
            // Do something w/ number
        } else {
            Debug.WriteLine("{0} is NaN!", numString);
        }
    }

}

这是代码的作用(写在我的头上,请不要只是 C&P 它。先测试它):

首先我们定义正则表达式。这匹配范围内的任何字符(括号之间)。

然后我们执行非常基本的错误检查:

  • 如果传递的参数为 null 或空,则抛出异常
  • 如果我们无法将参数解析为 FileInfo 对象,则路径可能无效。抛出异常。
  • 如果文件不存在,则抛出异常。

接下来,我们将整个文本文件读入内存(不是基于每行!)并使用我们定义的正则表达式将整个字符串拆分为字符串数组。

最后,我们循环遍历我们的字符串数组并将每个数字解析为浮点数(这就是您想要的。我个人会使用 doubledecimal 以获得更高的精度。请参阅 Tom Scott 的 this video .).

如果字符串没有解析为浮点数,那么您可以相应地处理错误。否则,使用变量 myFloat 执行您需要的操作。


编辑: 我以为我读到你想使用花车。我的错;我将数据类型更改为十进制。

【讨论】:

    【解决方案3】:

    您需要阅读所有行并将最小值和最大值之间的所有值替换为空字符串:

    float min = 800.5F, max = 850.5F;
    float currentValue;
    
    var lines = File.ReadAllLines(usersPath);
    var separator = ';'; // Change this according to which separator you're using between your values (if any)
    
    foreach (var line in lines)
    {
        foreach (string word in line.Trim().Split(separator))
        {
            if (float.TryParse(word.Trim(), out currentValue))
            {
                if (currentValue < min || currentValue > max)
                {
                    line.Replace(word, "");
                }
            }
        }
    }
    File.WriteAllLines(usersPath, lines);
    

    【讨论】:

    • 1.您假设每行只有 1 个数字。我没有读过这个问题。 2. 你不能像这样将字符串转换为浮点数。 3. 不要相信用户输入!如果一行显示“GOTCHA!!!!11!!”怎么办? ?
    • @Fildor 谢谢,我改进了答案
    • 根据 OP 需要处理的数量,将占位符浮点变量放在循环之外可能是值得的,并在将其与 min 和 max 进行比较之前使用它来存储转换后的单词,而不是对每个单词进行两次转换。
    • 我认为我们没有足够的知识来实际回答这个问题,而不做出某种可能会或可能不会成立但会使答案无效的假设。
    • @Fildor 这个问题现在得到了更多信息,这使得回答 imo 成为可能。使您建议的一些改进过时,但我仍会保留它们,因为它们对其他会找到此答案的人有好处
    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2021-03-02
    • 2018-12-18
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多