使用C#比较数字并从文本文件中删除数字

时间:2019-06-07 06:05:15

标签: c#

我创建了一个文本文件,其一些随机浮点数在743.6到1500.4之间。  我想出一种方法来读取文本文件(我已经这样做了)并包括一个数字范围:让说(743.6 <= x <= 800)并删除超出范围的数字,并最终将最终值存储在一个文本文件。

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

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();
        }
    }
}

3 个答案:

答案 0 :(得分:0)

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

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 :(得分:0)

这会将文件读取到内存中,进行解析,过滤,然后使用新数据覆盖现有文件。

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

答案 2 :(得分:0)

这是我的解决方案,带有基本的错误检测功能,并且由于使用了正则表达式而具有一定的鲁棒性。 作为一个序言:使用正则表达式可能会非常昂贵,并且并非总是可行的方式。

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

/*
    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以获得更高的精度。请参阅{{ 3}}。)。

如果字符串没有解析为浮点数,则可以相应地处理错误。否则,请使用变量myFloat进行操作。


编辑: 我以为我读过您想使用浮点数的信息。我的错;我将数据类型更改为十进制。