4

まず、数日前に C# の学習を始めたばかりなので、C# に関する知識は限られています。

ユーザーが入力した特定のフレーズのテキスト ファイルを解析し、それらを新しいテキスト ドキュメントに出力するプログラムを作成しようとしています。

現時点では、元の入力ファイルを検索し、ユーザーが選択したテキスト入力を収集し、それらの行を対処し、新しいテキスト ファイルを作成し、それらをマージして後で削除するプログラムを使用しています。

これはこれを作成する最も効率的な方法ではないと推測していますが、私はそれを作成し、初心者として理解できるように論理的に機能させました。

コードは次のとおりです。

private void TextInput1()
    {
        using (StreamReader fileOpen = new StreamReader(txtInput.Text))
        {
            using (StreamWriter fileWrite = new StreamWriter(@"*DIRECTORY*\FIRSTFILE.txt"))
            {
                string file;
                while ((file = fileOpen.ReadLine()) != null)
                {
                    if (file.Contains(txtFind.Text))
                    {
                            fileWrite.Write(file + "\r\n");
                    }
                }
            }
        }
    }

    private void TextInput2()
    {
        using (StreamReader fileOpen = new StreamReader(txtInput.Text))
        {
            using (StreamWriter fileWrite = new StreamWriter(@"*DIRECTORY*\SECONDFILE.txt"))
            {
                string file;
                while ((file = fileOpen.ReadLine()) != null)
                {
                    if (file.Contains(txtFind2.Text))
                    {
                        fileWrite.Write("\r\n" + file);
                    }
                }
            }
        }
    }

    private static void Combination()
    {
        ArrayList fileArray = new ArrayList();

        using (StreamWriter writer = File.CreateText(@"*DIRECTORY*\FINALOUTPUT.txt"))
        {

            using (StreamReader reader = File.OpenText(@"*DIRECTORY*\FIRSTFILE.txt"))
            {
                writer.Write(reader.ReadToEnd());
            }

            using (StreamReader reader = File.OpenText(@"*DIRECTORY*\SECONDFILE.txt"))
            {
                writer.Write(reader.ReadToEnd());
            }
        }

    }

    private static void Delete()
    {
        if (File.Exists(@"*DIRECTORY*\FIRSTFILE.txt"))
            {
                File.Delete(@"*DIRECTORY*\FIRSTFILE.txt");
            }

        if (File.Exists(@"*DIRECTORY*\SECONDFILE.txt"))
            {
                 File.Delete(@"*DIRECTORY*\SECONDFILE.txt");
            }

    }

作成される出力ファイルは、単純に最初のテキスト入力を出力し、続いて 2 番目を出力します。一度に1行ずつ1つのファイルにマージできるかどうか疑問に思っています。連続したファイルであるため、入力1からの情報が必要であり、2のすべてではなく2が必要です。

ありがとう、ニール。

4

5 に答える 5

6

2 つのファイルの内容を 1 つのマージされたファイルに 1 行ずつ結合するには、Combination() コードをこれに置き換えることができます。

string[] file1 = File.ReadAllLines("*DIRECTORY*\FIRSTFILE.txt");
string[] file2 = File.ReadAllLines("*DIRECTORY*\SECONDFILE.txt");

using (StreamWriter writer = File.CreateText(@"*DIRECTORY*\FINALOUTPUT.txt"))
{
    int lineNum = 0;
    while(lineNum < file1.Length || lineNum < file2.Length)
    {
        if(lineNum < file1.Length)
            writer.WriteLine(file1[lineNum]);
        if(lineNum < file2.Length)
            writer.WriteLine(file2[lineNum]);
        lineNum++;
    }
}

これは、2 つのファイルに同じ行数が含まれていないことを前提としています。

于 2012-12-12T12:38:27.463 に答える
5

この方法を試してください。3つのパスを受け取ることができます。ファイル 1、ファイル 2、およびファイル出力。

public void MergeFiles(string pathFile1, string pathFile2, string pathResult)
{
    File.WriteAllText(pathResult, File.ReadAllText(pathFile1) + File.ReadAllText(pathFile2));
}

pathResultファイルが存在する場合、メソッドWriteAllTextはそれを上書きします。System.IO名前空間を含めることを忘れないでください。

重要: 大きなファイルにはお勧めできません! このスレッドで利用可能な別のオプションを使用してください。

于 2012-12-12T12:26:52.773 に答える
2

入力ファイルが非常に大きく、メモリが不足している場合は、次のように 2 つのリーダーをラップすることもできます。

        using (StreamWriter writer = File.CreateText(@"*DIRECTORY*\FINALOUTPUT.txt"))
        {
            using (StreamReader reader1 = File.OpenText(@"*DIRECTORY*\FIRSTFILE.txt"))
            {
                using (StreamReader reader2 = File.OpenText(@"*DIRECTORY*\SECONDFILE.txt"))
                {
                    string line1 = null;
                    string line2 = null;
                    while ((line1 = reader1.ReadLine()) != null)
                    {
                        writer.WriteLine(line1);
                        line2 = reader2.ReadLine();
                        if(line2 != null)
                        {
                            writer.WriteLine(line2);
                        }
                    }
                }
            }
        }

それでも、入力ファイルに何行あるかを把握する必要がありますが、続行するための一般的なアイデアが得られると思います。

于 2012-12-12T12:46:36.820 に答える
1

拡張機能を使用するFileInfoと、次のようにして 1 つまたは複数のファイルをマージできます。

public static class FileInfoExtensions
{
  public static void MergeFiles(this FileInfo fi, string strOutputPath , params string[] filesToMerge)
  {
    var fiLines = File.ReadAllLines(fi.FullName).ToList();
    fiLines.AddRange(filesToMerge.SelectMany(file => File.ReadAllLines(file)));
    File.WriteAllLines(strOutputPath, fiLines.ToArray());
  }
}

使用法

  FileInfo fi = new FileInfo("input");
  fi.MergeFiles("output", "File2", "File3");
于 2012-12-12T12:57:11.227 に答える