我有一个文本文件,其中包含各种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个字符串上分开它直到结束。谁能引导我朝着正确的方向前进?我已经查看了字符串中的各种方法,例如Split
和StreamReader
,但我们对它的最佳方法感到困惑。我确定它很简单,但我无法弄清楚。
谢谢。
答案 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。