繁体   English   中英

读取文本文件并将文本写入 1000 个字符的块中,保持 C# 中的单词完整

[英]Read a text file and write the texts in chunks of 1000 characters keeping the words intact in C#

我正在尝试读取文件并在每 1000 个字符后拆分文本。 但我想保持原样。 所以它应该只是在空间上分裂。 如果第 1000 个字符不是空格,则在它之前或之后的第一个空格处拆分。 知道怎么做吗? 我还从文本中删除了多余的空格。

                 while ((line = file.ReadLine()) != null)
        {

            text = text + line.Trim();
            noSpaceText = Regex.Replace(text, @"\r\n?|\n/", "");      

        }

        List<string> rowsToInsert = new List<string>();

        int splitAt = 1000; 
        for (int i = 0; i < noSpaceText.Length; i = i + splitAt)
        {
                if (noSpaceText.Length - i >= splitAt)
            {
                rowsToInsert.Add(noSpaceText.Substring(i, splitAt));
            }
            else
                    rowsToInsert.Add(noSpaceText.Substring(i, 
            ((noSpaceText.Length - i))));
        }

        foreach(var item in rowsToInsert)
          {
            Console.WriteLine(item);
          }

好的,只需输入这个未经测试的解决方案就可以了:

public static List<string> SplitOn(this string input, int charLength, char[] seperator)
        {
            List<string> splits = new List<string>();
            var tokens = input.Split(seperator);
            // -1 because first token adds 1 to length
            int totalLength = -1;
            List<string> segments = new List<string>;
            foreach(var t in tokens)
            {
                if(totalLength + t.Length+1 > charLength)
                {
                    splits.Add(String.Join(" ", segments));
                    totalLength = -1;
                    segments.Clear();
                }
                totalLength += t.Length + 1;
                segments.Add(t);
            }
            if(segments.Count>0)
            {
                splits.Add(String.Join(" ", segments));
            }
            return splits;
        }

它是一种扩展方法,它通过空格将输入文本分割成段,这意味着,我只用单词迭代一个数组。 然后计算每个段的长度,检查总长度并将其添加到结果列表中。

另一种解决方案:

public static List<string> SplitString(string stringInput, int blockLength)
{
    var output = new List<string>();
    var count = 0;
    while(count < stringInput.Length)
    {
        string block = "";
        if(count + blockLength > stringInput.Length)
        {
            block = stringInput.Substring(count, stringInput.Length - count);   
        }
        else
        {
            block = stringInput.Substring(count, blockLength + 1);  
        }

        if(block.Length < blockLength)
        {
            output.Add(block);  
            count += block.Length;
        }
        else if(block.EndsWith(" "))
        {
            output.Add(block);
            count = count+blockLength + 1;
        }
        else
        {   
            output.Add(block.Substring(0, block.LastIndexOf(" ")));
            count = count + block.LastIndexOf(" ") +1;
        }
    }

    return output;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM