2

所以我有一个我正在尝试实现的通用号码检查:

    public static bool isNumberValid(string Number)
    {
    }

我想读取文本文件的内容(仅包含数字)并检查每一行的数字并使用isNumberValid. 然后我想将结果输出到一个新的文本文件,我做到了这一点:

    private void button2_Click(object sender, EventArgs e)
    {
        int size = -1;
        DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
        if (result == DialogResult.OK) // Test result.
        {
            string file = openFileDialog1.FileName;
            try
            {
                string text = File.ReadAllText(file);
                size = text.Length;
                using (StringReader reader = new StringReader(text))
                {

                        foreach (int number in text)
                        {
                            // check against isNumberValid
                            // write the results to a new textfile 
                        }
                    }
                }

            catch (IOException)
            {
            }
        }
    }

如果有人可以提供帮助,有点卡在这里?

文本文件在列表中包含几个数字:

4564

4565

4455

等等

我要编写的新文本文件只是末尾附加了 true 或 false 的数字:

第4564章

4

5 回答 5

5

您不需要一次将整个文件读入内存。你可以写:

using (var writer = new StreamWriter(outputPath))
{
    foreach (var line in File.ReadLines(filename)
    {
        foreach (var num in line.Split(','))
        {
            writer.Write(num + " ");
            writer.WriteLine(IsNumberValid(num));
        }
    }
}

这里的主要优点是内存占用要小得多,因为它一次只加载文件的一小部分。

于 2013-05-14T20:00:36.783 回答
4

您可以尝试这样做以保持您最初遵循的模式......

private void button1_Click(object sender, EventArgs e)
{
    DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
    if (result == DialogResult.OK) // Test result.
    {
        string file = openFileDialog1.FileName;
        try
        {
            using (var reader = new StreamReader(file))
            {
                using (var writer = new StreamWriter("results.txt"))
                {
                    string currentNumber;
                    while ((currentNumber = reader.ReadLine()) != null)
                    {
                        if (IsNumberValid(currentNumber))
                            writer.WriteLine(String.Format("{0} true", currentNumber));
                    }
                }
            }
        }

        catch (IOException)
        {
        }
    }
}

public bool IsNumberValid(string number)
{
    //Whatever code you use to check your number
}
于 2013-05-14T20:15:45.477 回答
1

您需要将循环替换为如下所示:

string[] lines = File.ReadAllLines(file);
foreach (var s in lines)
{
  int number = int.Parse(s);
  ...
}

这将读取文件的每一行,假设每行只有一个数字,并且行用 CRLF 符号分隔。并将每个数字解析为整数,假设整数不大于 2,147,483,647 且不小于 -2,147,483,648,并且整数存储在您的语言环境设置中,带或不带组分隔符。

如果任何行为空或包含非整数 - 代码将引发异常。

于 2013-05-14T19:49:02.347 回答
0

你可以尝试这样的事情:

FileStream fsIn = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
using (StreamReader sr = new StreamReader(fsIn))
 {

     line = sr.ReadLine();

     while (!String.IsNullOrEmpty(line)
     {
        line = sr.ReadLine();
       //call isNumberValid on each line, store results to list
     }
 }

然后使用打印列表FileStream

正如其他人所提到的,您的isNumberValid方法可以使用该Int32.TryParse方法,但是由于您说您的文本文件仅包含数字,因此这可能没有必要。如果您只是想完全匹配数字,您可以使用number == line.

于 2013-05-14T19:53:32.777 回答
0

首先,将输入文件的所有行加载到字符串数组中,
然后打开输出文件并循环遍历字符串数组,

在空格分隔符处拆分每一行并将每个部分传递给您的静态方法。

如果输入文本不是有效的 Int32 数字 ,静态方法使用Int32.TryParse来确定您是否有一个有效的整数,而不会引发异常。

根据方法的结果将所需的文本写入输出文件。

// Read all lines in memory (Could be optimized, but for this example let's go with a small file)
string[] lines = File.ReadAllLines(file);
// Open the output file
using (StringWriter writer = new StringWriter(outputFile))
{
    // Loop on every line loaded from the input file
    // Example "1234 ABCD 456 ZZZZ 98989"
    foreach (string line in lines)
    {
        // Split the current line in the wannabe numbers
        string[] numParts = line.Split(' ');

        // Loop on every part and pass to the validation
        foreach(string number in numParts)
        {
            // Write the result to the output file
            if(isNumberValid(number))
               writer.WriteLine(number + " True");
            else
               writer.WriteLine(number + " False");
        }
    }
}

// Receives a string and test if it is a Int32 number
public static bool isNumberValid(string Number)
{
    int result;
    return Int32.TryParse(Number, out result);
}

当然,这仅在您对“数字”的定义等于 Int32 数据类型的允许值时才有效

于 2013-05-14T19:50:29.853 回答