【问题标题】:Manipulating input and output streams from one file to another操作从一个文件到另一个文件的输入和输出流
【发布时间】:2015-04-04 17:09:36
【问题描述】:

我每隔几秒就有一个新文件,如下所示:

23
45
21
1
9
23
42
22
40
11
33
32
18
11
12
32
22
7
37
30

在这个要读取的文本文件中,每行有一个数字,介于 1-40 之间。这些文件每分钟生成几次。

我正在尝试使用StringReaderStringWriter 对它们进行升序排序。我的逻辑一定是有缺陷的,因为我打算将其发送到的文件中没有显示任何内容。我将true 作为append 参数传递,但我的排序文件中仍然没有填充任何内容。

目标是使用 for 循环从文本文件中读取,该循环迭代 1-40 个 int 值,并将其与读取的文件中的每个字符串或 int 进行比较,找到时将读取文件中的内容复制到已排序的文件中文件按排序顺序。

我已经研究了一段时间,它应该可以工作,但不能。像我所做的那样,使用文件读取器/写入器类或流读取器/写入器会更容易吗?

public static void ProcessDirectory()
{
    int variable1;
    StreamReader readToSort = new StreamReader(@"C:write.txt");
    StreamWriter writeSorted = new StreamWriter(@"C:Sorted_File.txt", true);

    for (int i = 1; i > 41; i++)
    {
        variable1 = (readToSort.Read());

        while (!readToSort.EndOfStream)
        {
            if (variable1 == i)
            {
                writeSorted.Write(i.ToString() + "\n");
            }
        }

        MessageBox.Show("processing #" + variable1);
    }

    readToSort.Close();
    writeSorted.Close();
}

【问题讨论】:

  • 如果你不咬手喂你,你更有可能得到有用的答案。没有人对你“废话”;我将之前的评论视为从您那里获取更多信息的简单尝试,以便更好地理解问题。有时,当不使用明显的解决方案时,这是因为 OP 没有意识到它们;其他时候是因为有一些特定的要求不使用它们。无论如何,对帮助尝试的敌意反应会适得其反。
  • 我仍然无法理解您在这里实际想要完成的工作。您发布的代码有明显的错误——一次读取一个字符而不是一整行,第一次读取后无限循环,举几个例子——实际上没有任何东西可以帮助理解什么输出你想要一个给定的输入。如果您真的想对文件进行排序,则必须将所有数据一起排序;对于 6GB 的文件,这可能意味着您想要进行合并排序。或者,也许您想要的不是全数据排序?从你的问题看不清楚。
  • 请提供一些示例输入数据,如果数据位于多个文件中,请在您的问题中单独格式化,并清楚地显示(并解释)在给定示例输入的情况下您想要实现的输出。请阅读stackoverflow.com/help/how-to-ask,了解有关如何以清晰、可回答的方式提出问题的其他建议。
  • 尽管如此,请在您的问题中明确输入是什么。您只提供了一个整数列表。如果您想处理多个文件,您需要非常清楚这些文件之间的关系以及您希望如何一起处理它们。此外,您还没有提供任何示例输出。最后,请注意,当您收到有关您的问题的任何 cmets 的通知时,除非您在自己的评论中输入 @ 符号和他们的用户名,否则评论者不会知道您已回复。例如。 @Deland。
  • 我不知道如何有任何想法,因为我还不知道您要做什么。我了解您认为您已经充分解释了目标,但是当我说您没有充分解释时,请相信我。请将您的问题视为一个完全的局外人,对问题的了解为零,并考虑该局外人需要什么来解决它。正如上面的各种 cmets(包括我自己的)所解释的那样,您的问题仍然缺少很多细节。

标签: c# sorting text streamreader streamwriter.write


【解决方案1】:

为确保我正确理解您要解决的问题,我根据您的问题及其下方的 cmets 列出了要求。

  • 您的输入包含几个 GB 大的文本文件,因此无法完全加载到内存中
  • 这些文本文件仅包含数字值,每个值都占一行
  • 这些数值需要按排序顺序写入另一个输出文件

我并不完全清楚您的输入包含哪些内容,因此您可能需要在此处更正我。您是否需要合并多个(较小的)输入文件,对合并的内容进行排序,然后将其输出到单个(较大的)文件中?

例子:

  • 输入:file1_unsorted.txt (6GB)、file2_unsorted.txt (6GB)
  • 输出:file1_and_file2_sorted.txt (12GB)

如果是这样,每个单独的文件是否足够小以加载到内存中(但不是组合的整体?)

示例(假设 1GB RAM):

  • 输入:file1_unsorted.txt (600MB)、file2_unsorted.txt (600MB)、...、file10_unsorted.txt (600MB)
  • 输出:file1_through_file10_sorted.txt (6GB)

或者,每个单独的输入文件是否足够大以至于无法放入内存,这些文件是否都需要排序到相应的输出文件中?

例子:

  • 输入:file_unsorted.txt (6GB)
  • 输出:file_sorted.txt (6GB)

假设您的(未排序的)输入和(排序的)输出文件都太大而无法放入内存,您需要一种方法来对这些文件的内容进行分块排序。您要查找的关键字是外部排序

这是 CodeProject 上的一个很好的例子(带有源代码和解释):Sorting Huge Text Files

您可能想研究一个有点相似的 StackOverflow 问题:Reading large text files with streams in C#

如果您在实际实施方面需要任何帮助,请提供有关您的输入和(所需)输出的附加信息。文件本身显然太大而无法上传 - 包含输入和输出文件的目录屏幕截图也可以。然后我(和其他人)可以看到每个文件有多大以及它们需要聚合到什么程度(如果有的话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多