一見したところ、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();
}
わかりましたので、上記の方法は簡単に実行され、特定の基準に一致する単語を抽出して句読点を保持します。パズルの最後のピースは、ファイルの読み取りとディスクへの書き込みです。このために、StreamReaderとStreamWriterを使用できます。(ファイル アクセスに問題がある場合は、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);
最後に。これは、リクエストを処理する最も効果的な方法ではありません。また、パフォーマンスのために構築されたものでもありません。これは、ファイルから単語を解析する方法の単なるデモンストレーションです。
乾杯