C# 在第16个字符上将字符串拆分为数组
我有一个文本文件,其中包含各种16个字符的字符串,它们彼此附加在一起,并且在单独的行上。我已经做到了C# 在第16个字符上将字符串拆分为数组,c#,arrays,string,split,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; 删除
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
中的方法,但是我不知道最好的方法是什么。我相信这很简单,但我搞不懂
谢谢。创建一个列表来存放您的代币。然后获取长度为16的后续子字符串,并将它们添加到列表中
List<string> tokens = new List<string>();
for(int i=0; i+16<=FileText.Length; i+=16) {
tokens.Add(FileText.Substring(i,16));
}
List tokens=newlist();
对于(int i=0;i+16,调整以下答案:
你可以试着这样做:
string longstr = "thisisaverylongstringveryveryveryveryverythisisaverylongstringveryveryveryveryvery";
IEnumerable<string> splitString = Regex.Split(longstr, "(.{16})").Where(s => s != String.Empty);
foreach (string str in splitString)
{
System.Console.WriteLine(str);
}
请试试这个方法。我没有试过,但用过一次
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++;
}
int CharCount=FileText.Length;
int-arrayhold=(CharCount/16)+2;
整数计数=0;
字符串[]数组=新字符串[arrayhold];
对于(int i=0;i16)
{
array[count]=FileText.Substring(i,16);
}
如果(currentleft尝试此选项:
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();
结果是包含所有16个字符字符串的列表。一个可能的解决方案可能如下所示(提取为扩展方法,并使其成为动态的,以防需要不同的令牌大小,并且没有硬编码的依赖项):
输出为:
1234567890ABCDEF
1234567890ABCDEF
1234567890ABCDEF
1234567890
不同令牌大小的用法:
以及相应的输出:
1234567890ABC
DEF1234567890
ABCDEF1234567
890ABCDEF1234
567890
这不是一个花哨的解决方案(很可能会优化速度),但它可以工作,而且很容易理解和实现。所以您只想删除换行符?@Herblore因此文件中的每行都有16个字符?如果字符串长度不是16的倍数,则将失败。@UlugbekUmirov:感谢您的发现。现在应该可以工作了。如果长度小于16,我们不应该忽略最后一部分。您可以使用Math.Min(16,FileText.Length-i)
作为长度参数。@UlugbekUmirov是的,看到我的答案了吗-1原因是剩下的字符怎么办?@SriramSakthivel现在可以工作了,通过添加正确的方法来处理剩余字符来证明。感谢ideone。@所有的反对者,请看这个并修复反对者,现在可以工作了!:(最好是,为什么是-1?答案有什么问题?
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();
}
}
// 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