【问题标题】:Remove float numbers outside the range and keep numbers inside the range in textfile删除范围外的浮点数并将数字保留在文本文件中的范围内
【发布时间】:2019-10-25 09:09:15
【问题描述】:

首先,我在一个文本文件中有一组随机浮点数,我已经成功地制作了一个能够在编译后从文本文件中读取数字的代码。现在我需要创建一个数字范围并从文本文件中删除范围之外的数字,并且只将数字保留在文本文件内的范围内。例如,我想只保留 743 和 1000 之间的数字,并从文本文件中删除其余数字。

请在这件事上帮助我。谢谢你。

我尝试制作如下所示的代码,但它没有显示预期的结果。编译后,我的文本文件是空的,意味着文本文件中的所有数字都被删除了。

这是我在文本文件中创建的一组随机浮点数:

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 usersPath = "C:\\Users\\Student\\Desktop\\ConsoleApp1\\ConsoleApp1\\Data\\TextFile.txt";

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

        StreamWriter writer = new StreamWriter(usersPath);
        foreach (string line in lines)
        {
            double x = double.Parse(line);

            if (x > 740.7 && x < 1500.6)
            {
                writer.Write(line);
              //Console.WriteLine(line);

            }
            Console.ReadLine();

        }
        writer.Close();

    }

}

}

【问题讨论】:

  • 除了需要将Write 替换为WriteLine,并且必须在每一行上按回车/回车键(由于Console.ReadLine() 的位置,您的代码可以像您一样工作期望,并且文件不是空的。您能否详细解释一下您所面临的问题?调试时会发生什么?
  • 你需要删除Console.ReadLine();
  • 致 Chetan 先生,如果我这样做会出现错误:System.FormatException: 'Input string was not in a correct format.'
  • @user 请参阅 TheGeneral 的回答,第 3 点。您可能正在阅读空行或其他内容,而空行不是 double
  • 好的,约翰先生,我会进一步调查的

标签: c#


【解决方案1】:

问题是你有一个很讨厌的Console.ReadLine().Meaning,你要求用户输入并且程序从不写一行。

还有其他问题

  1. 您使用的是writer.Write(line); 而不是writer.WriteLine(line);,这会将所有内容合并到一行中
  2. 您应该使用using 语句
  3. double.Parse 会在遇到空行或意外情况时抛出异常,您可以改用 double.TryParse
  4. 您可以改用File.WriteAllLines
  5. 作为额外的奖励,您可以在LINQ 中完成这一切

你的固定代码

var lines = File.ReadAllLines(usersPath);

using (var writer = new StreamWriter(usersPath))
{
   foreach (var line in lines)
      if(double.TryParse(line,out var value) && value > 740.7 && value < 1500.6)
          writer.WriteLine(value);
}

或者一个更简洁的容错示例

string usersPath = $"C:\\Users\\Student\\Desktop\\ConsoleApp1\\ConsoleApp1\\Data\\TextFile.txt";


// read all lines
var lines = File.ReadAllLines(usersPath)

                 // for each line, try and and convert it double, if not return null
                .Select(x => double.TryParse(x, out var value) ? value : (double?)null)

                 // filter all nulls and values outside of the range
                .Where(x => x != null && x > 740.7 && x < 1500.6)

                 // convert each element to a string
                .Select(x => x.ToString());

// write all lines
File.WriteAllLines(usersPath, lines);

其他资源

File.ReadAllLines Method

打开一个文本文件,将文件的所有行读入一个字符串数组, 然后关闭文件。

Enumerable.Select Method

将序列的每个元素投影到一个新的形式中。

Double.TryParse Method

将数字的字符串表示形式转换为其双精度 浮点数等效。返回值指示是否 转换成功或失败。

Enumerable.Where Method

根据谓词过滤一系列值。

File.WriteAllLines Method

创建一个新文件,将一个或多个字符串写入文件,然后 关闭文件。

【讨论】:

  • 那么我应该评论整个 foreach 循环吗?并将上面的示例粘贴到 streamwriter 语句下方?
  • @user11612402 你可以替换除此行之外的所有内容usersPath
  • 那么,在我声明用户路径语句的那一行下面?
  • 你能解释一下你做了什么,特别是你做了什么吗?让我明白
  • 如果我想添加更多的 1 个数字范围,我应该继续使用 && at Where 语句吗?
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 2018-02-16
  • 2017-06-18
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
相关资源
最近更新 更多