在第16个字符串中将字符串拆分为数组

时间:2014-04-21 09:21:09

标签: c# arrays string split

我有一个文本文件,其中包含各种16个字符串,这些字符串彼此相连并且在不同的行上。我已经完成了这个

FileInfo f = new FileInfo("d:\\test.txt");
string FilePath = ("d:\\test.txt");
string FileText = new System.IO.StreamReader(FilePath).ReadToEnd().Replace("\r\n", "");
CharCount = FileText.Length;

删除所有新行并创建一个大量附加的字符串。我现在需要将这个庞大的字符串拆分成一个数组。我需要在连续的第16个字符串上分开它直到结束。谁能引导我朝着正确的方向前进?我已经查看了字符串中的各种方法,例如SplitStreamReader,但我们对它的最佳方法感到困惑。我确定它很简单,但我无法弄清楚。

谢谢。

5 个答案:

答案 0 :(得分:0)

创建一个列表来保存您的令牌。然后得到长度为16的后续子串,并将它们添加到列表中。

List<string> tokens = new List<string>();
for(int i=0; i+16<=FileText.Length; i+=16) {
    tokens.Add(FileText.Substring(i,16));
}

如评论中所述,如果它少于16个字符,则会忽略最后一个标记。无论如何你想要它,你可以写:

List<string> tokens = new List<string>();
for(int i=0; i<FileText.Length; i+=16) {
    int len = Math.Min(16, FileText.Length-i));
    tokens.Add(FileText.Substring(i,len);
}

答案 1 :(得分:0)

调整here的答案:

你可以尝试这样的事情:

        string longstr = "thisisaverylongstringveryveryveryveryverythisisaverylongstringveryveryveryveryvery";
        IEnumerable<string> splitString = Regex.Split(longstr, "(.{16})").Where(s => s != String.Empty);
        foreach (string str in splitString)
        {
            System.Console.WriteLine(str);
        }

收率:

thisisaverylongs    
tringveryveryver    
yveryverythisisa    
verylongstringve    
ryveryveryveryve
ry

答案 2 :(得分:0)

一种可能的解决方案可能看起来像这样(提取为扩展方法并且是动态的,以防需要不同的令牌大小且没有硬编码依赖项):

public static class ProjectExtensions
{
    public static String[] Chunkify(this String input, int chunkSize = 16)
    {
        // result
        var output = new List<String>();
        // temp helper
        var chunk = String.Empty;
        long counter = 0;
        // tokenize to 16 chars
        input.ToCharArray().ToList().ForEach(ch => 
        {
            counter++;
            chunk += ch;
            if ((counter % chunkSize) == 0)
            {
                output.Add(chunk);
                chunk = String.Empty;
            }
        });
        // add the rest
        output.Add(chunk);

        return output.ToArray();
    }
}

标准用法(16个字符)如下所示:

// 3 inputs x 16 characters and 1 x 10 characters
var input = @"1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890";
foreach (var chunk in input.Chunkify())
{
    Console.WriteLine(chunk);
}

输出结果为:

1234567890ABCDEF
1234567890ABCDEF
1234567890ABCDEF
1234567890

使用不同的令牌大小

foreach (var chunk in input.Chunkify(13))
{
    Console.WriteLine(chunk);
}

和相应的输出:

1234567890ABC
DEF1234567890
ABCDEF1234567
890ABCDEF1234
567890

这不是一个花哨的解决方案(并且可以针对速度进行优化),但它很有效且易于理解和实施。

答案 3 :(得分:-1)

请尝试这种方法。我没试过,但是曾经用过一次。

    int CharCount = FileText.Length;
    int arrayhold = (CharCount/16)+2;
    int count=0;
    string[] array = new string[arrayhold];
    for(int i=0; i<FileText.Length; i+=16)
       {
          int currentleft = FileText.Length-(16*count);
          if(currentleft>16)
            {
                  array[count]=FileText.Substring(i,16);
            }
          if(currentleft<16)
            {
                  array[count]=FileText.Substring(i,currentleft);
            }

              count++;
        }

这是新代码并提供 TRUE 剩余处理。在ideone中测试

希望它有效

答案 4 :(得分:-1)

试试这个:

var testArray = "sdfsdfjshdfalkjsdfhalsdkfjhalsdkfjhasldkjfhasldkfjhasdflkjhasdlfkjhasdlfkjhasdlfkjhasldfkjhalsjfdkhklahjsf";
var i = 0;
var query = from s in testArray
            let num = i++
            group s by num / 16 into g
            select new {Value = new string(g.ToArray())};

var result = query.Select(x => x.Value).ToList();

result是包含所有16个char字符串的List。