0

ここの初心者

C# で txt ファイルの内容を編集する方法がわかりません。私は次の疑似コードを実行しようとしています:

foreach word in file.txt
        if ((word.length < 4) || (word.length > 11))
                        delete word from file.txt

私は何をする必要がありますか?streamreader/writer クラスが関係していることは知っていますが、それらがどのように機能するかわかりません。

4

5 に答える 5

3

一見したところ、StreamReader を使用してファイルを読み取り、スペースを分割してから、長さの基準を満たさない単語を削除するのは簡単に思えます。そして、StreamWriter を使用して結果を書き戻します。ただし、文字列の解析 (単語の解析) では、追加の処理が必要になる「特別な」ケースが多数発生します。

プログラミング言語で言葉を説明するのは難しい。たとえば、単語には単語の一部である句読点が含まれている場合や、文の終わりや改行などを示す句読点で始まる \ 終了する場合があります。

そうは言っても、次のルールがあるとしましょう。

  • 単語には 1 つ以上の英数字が含まれています
  • 単語には、次の句読点が含まれる場合があります。[-,_']
  • 単語は、句読点またはスペースで区切ることができます。

これらのルールに従って、すべてのテキストを簡単に読み取り、要求された操作を実行できます。最初はワードプロセッシングから始めます。できることは、このための静的クラスを作成することです。このクラスを呼び出しましょうWordProcessor

これは、文字列からルールに基づいて単語を解析するためのコメント付きのコードです。

/// <summary>
/// characters that denote a new word
/// </summary>
const string wordSplitPuncuation = ",.!&()[] \"";

/// <summary>
/// Parse a string
/// </summary>
/// <param name="inputString">the string to parse</param>
/// <param name="preservePuncuation">preserve punctuation in the string</param>
/// <returns></returns>
public static IList<string> ParseString(string inputString, bool preservePuncuation)
{
    //create a list to hold our words
    List<string> rebuildWords = new List<string>();

    //the current word
    string currentWord = "";

    //iterate through all characters in a word
    foreach(var character in inputString)
    {
        //is the character is part of the split characters 
        if(wordSplitPuncuation.IndexOf(character) > -1)
        {
            if (currentWord != "")
                rebuildWords.Add(currentWord);
            if (preservePuncuation)
                rebuildWords.Add("" + character);
            currentWord = "";
        }
        //else add the word to the current word
        else
            currentWord += character;
    }
    return rebuildWords;
}

上記は非常に基本的なもので、preserve puncuation を true に設定すると、同じ文字列が返されます。

クラスの次の部分は、特定の長さよりも短い、または特定の長さを超える単語を削除するために実際に使用されます。これは、上記の方法を使用して単語を断片に分割し、各断片を変数に対して個別に評価します。

/// <summary>
/// Removes words from a string that are greater or less than the supplied lengths
/// </summary>
/// <param name="inputString">the input string to parse</param>
/// <param name="preservePuncuation">flag to preserve the puncation for rebuilding the string</param>
/// <param name="minWordLength">the minimum word length</param>
/// <param name="maxWordLength">the maximum word length</param>
/// <returns></returns>
public static string RemoveWords(string inputString, bool preservePuncuation, int minWordLength, int maxWordLength)
{
    //parse our string into pieces for iteration
    var words = WordProcessor.ParseString(inputString, preservePuncuation);

    //initialize our complete string container
    List<string> completeString = new List<string>();

    //enumerate each word
    foreach (var word in words)
    {
        //does the word index of zero matches our word split (as puncuation is one character)
        if (wordSplitPuncuation.IndexOf(word[0]) > -1)
        {
            //are we preserviing puncuation
            if (preservePuncuation)
                //add the puncuation
                completeString.Add(word);
        }
        //check that the word length is greater or equal to the min length and less than or equal to the max word length
        else if (word.Length >= minWordLength && word.Length <= maxWordLength)
            //add to the complete string list
            completeString.Add(word);
    }
    //return the completed string by joining the completed string contain together, removing all double spaces and triming the leading and ending white spaces
    return string.Join("", completeString).Replace("  ", " ").Trim();
}

わかりましたので、上記の方法は簡単に実行され、特定の基準に一致する単語を抽出して句読点を保持します。パズルの最後のピースは、ファイルの読み取りとディスクへの書き込みです。このために、StreamReaderStreamWriterを使用できます。(ファイル アクセスに問題がある場合は、FileStreamクラスを参照してください)。

以下の同じコードは、単純にファイルを読み取り、上記のメソッドを呼び出してから、ファイルを元の場所に書き戻します。

/// <summary>
/// Removes words from a file
/// </summary>
/// <param name="filePath">the file path to parse</param>
/// <param name="preservePuncuation">flag to preserve the puncation for rebuilding the string</param>
/// <param name="minWordLength">the minimum word length</param>
/// <param name="maxWordLength">the maximum word length</param>
public static void RemoveWordsFromAFile(string filePath, bool preservePuncuation, int minWordLength, int maxWordLength)
{


    //our parsed string
    string parseString = "";

    //read the file
    using (var reader = new StreamReader(filePath))
    {
        parseString = reader.ReadToEnd();
    }

    //open a new writer
    using (var writer = new StreamWriter(filePath))
    {
        //parse our string to remove words
        parseString = WordProcessor.RemoveWords(parseString, preservePuncuation, minWordLength, maxWordLength);

        //write our string
        writer.Write(parseString);
        writer.Flush();
    }
}

上記のコードと同じように単純にファイルを開き、パラメーターに対してファイルを解析してから、ファイルを再書き込みします。

これは、メソッドを直接呼び出すだけで再利用できます。

WordProcessor.RemoveWordsFromAFile(@"D:\test.txt", true, 4, 10);

最後に。これは、リクエストを処理する最も効果的な方法ではありません。また、パフォーマンスのために構築されたものでもありません。これは、ファイルから単語を解析する方法の単なるデモンストレーションです。

乾杯

于 2013-11-13T05:45:58.747 に答える
0
        var filePath = HttpRuntime.AppDomainAppPath + "your file path";
        if (!File.Exists(filePath))
            return;
        using (var sr = new StreamReader(filePath))
        {
            var text = sr.ReadToEnd();
            if (text.Length < 4 || text.Length > 11)
            {
                using (var sw = new StreamWriter(filePath))
                {
                    sw.Write("");
                }
            }
        }
于 2013-11-13T05:31:13.093 に答える
0

コンセプトは次のようなものになります。

While(there is input to read from the input file)
{
read the input
if(input fits your criteria of shorter than 4 or longer than 11)
   ignore it
else
   write it to output file (which is a new file, NOT the file you read it from)
}

streamreader.readline()を使用できます

于 2013-11-13T05:08:21.230 に答える