在C#中读取/写入txt文件

时间:2013-11-13 05:02:06

标签: c# streamreader streamwriter

初学者

我很难理解如何在c#中编辑txt文件的内容。我正在尝试执行以下-pseudocode:

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

我需要做什么?我知道它涉及流读取器/编写器类,但我不知道它们是如何工作的。

5 个答案:

答案 0 :(得分:3)

乍一看,使用StreamReader读取文件,拆分空间然后删除不符合长度标准的单词,这似乎很简单。然后使用StreamWriter将结果写回来。但是,对于字符串解析(单词解析),您会遇到一堆“特殊”情况,可能需要额外处理。

在编程语言中很难描述单词。例如,一个单词可能包含作为单词一部分的puncuation,或者它可能以一个表示句子结尾,新行等的punction开头\结尾。

现在说,我们可以说我们有以下规则。

  • 一个单词包含一个或多个字母数字字符
  • 一个单词可能包含以下内容。 [ - ,_']
  • 单词可以用标点符号或空格分隔。

遵循这些规则,我们可以轻松阅读所有文本并执行您要求的操作。我先从单词处理开始。你可以做的是为此创建一个静态类。让我们称这个班为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);

最后一点。这绝不是处理您的请求的最有效方式,绝不是为了提高性能而构建的。这只是如何解析文件中的单词的演示。

干杯

答案 1 :(得分: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()

答案 2 :(得分:0)

我会根据您在问题中描述的要求来研究正则表达式以进行模式匹配: 这是关于正则表达式的一个很好的教程。定位单词并用空格替换它们。

将以下文章与如何读/写文本文件相结合。 根据文件的大小,您可以只读取整个文件,删除要删除的单词,最后再写回整个内容。 How to both read and write a file in C#

如果文件非常大,您可能需要优化它并以块的形式读取文件。

答案 3 :(得分:0)

试试这个。

  1. Get the contents of the text file in a string variable.

  2. 将带有空格的文本拆分为分隔符,以获取数组中的单词。

  3. 然后加入该数组中的单词以符合您的标准回写

    到文本文件。

答案 4 :(得分: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("");
                }
            }
        }