在我的C#程序中(我是C#的新手,所以我希望我能正确地做事),我试图读取文本文件中的所有行,这将是看一下这方面的内容,但有更多的条目(这些是虚构的人,所以不要担心隐私):
Logan Babbleton ID #: 0000011 108 Crest Circle Mr. Logan M. Babbleton
Pittsburgh PA 15668 SSN: XXX-XX-XXXX
Current Program(s): Bachelor of Science in Cybersecurity
Mr. Carter J. Bairn ID #: 0000012 21340 North Drive Mr. Carter Joseph Bairn
Pittsburgh PA 15668 SSN: XXX-XX-XXXX
Current Program(s): Bachelor of Science in Computer Science
我将这些行读入数组concentrationArray
,并希望找到包含单词" Current"的行,将它们拆分为"(s):&# 34; in" Program(s):"并打印下面的文字。我之前在我的程序中已经完成了这项工作,但是转而使用ID,就像这样:
nameLine = nameIDLine.Split(new string[] { "ID" }, StringSplitOptions.None)[1];
但是,每当我尝试这样做时,我都会收到错误,指出我的索引超出了我的分割数组(不是我的concentrationArray
)。这就是我目前所拥有的:
for (int i = 0; i < concentrationArray.Length; i++)
{
if (concentrationArray[i].Contains("Current"))
{
lstTest.Items.Add(concentrationArray[i].Split(new string[] { "(s): " }, StringSplitOptions.None)[1]);
}
}
我感到困惑的是,如果我将索引更改为0而不是1,它将完美地打印出所有内容,但它会打印出上半部分,而不是下半部分,这就是我想要的。我究竟做错了什么?任何反馈都非常感谢,因为我在C#上相当新,并且很想学习我的能力。谢谢!
编辑 - 我能想到的唯一一件事就是有时在我用来分隔每个元素的字符串后面没有任何东西,但当我检查我的文本文件时,我发现事实并非如此,并且在字符串之后总会有一些东西用于分离。
答案 0 :(得分:2)
在尝试阅读索引1之前,您应该检查拆分结果 如果您的行不包含&#34;(s):&#34;你的代码会因给定的例外而崩溃
for (int i = 0; i < concentrationArray.Length; i++)
{
if (concentrationArray[i].Contains("Current"))
{
string[] result = concentrationArray[i].Split(new string[] { "(s): " }, StringSplitOptions.None);
if(result.Length > 1)
lstTest.Items.Add(result[1]);
else
Console.WriteLine($"Line {i} has no (s): followeed by a space");
}
}
要完成答案,如果您始终使用索引0,那么没有错误,因为当输入字符串中没有分隔符时,输出是一个包含整个未分裂字符串的单个元素的数组
答案 1 :(得分:1)
如果该行始终以
开头Current Program(s):
然后为什么不用这样的空字符串替换它:
concentrationArray[i].Replace("Current Program(s): ", "")
答案 2 :(得分:1)
如果你把问题分开,可能会更容易理解,也更容易重复使用。它也会更容易测试。一个例子可能是......
var allLines = File.ReadLines(@"C:\your\file\path\data.txt");
var currentPrograms = ExtractCurrentPrograms(allLines);
if (currentPrograms.Any())
{
lstTest.Items.AddRange(currentPrograms);
}
...
private static IEnumerable<string> ExtractCurrentPrograms(IEnumerable<string> lines)
{
const string targetPhrase = "Current Program(s):";
foreach (var line in lines.Where(l => !string.IsNullOrWhiteSpace(l)))
{
var index = line.IndexOf(targetPhrase);
if (index >= 0)
{
var programIndex = index + targetPhrase.Length;
var text = line.Substring(programIndex).Trim();
if (!string.IsNullOrWhiteSpace(text))
{
yield return text;
}
}
}
}
答案 3 :(得分:0)
这是一个有点不同的方法
List<string> test = new List<string>();
string pattern = "Current Program(s):";
string[] allLines = File.ReadAllLines(@"C:\Users\xyz\Source\demo.txt");
foreach (var line in allLines)
{
if (line.Contains(pattern))
{
test.Add(line.Substring(line.IndexOf(pattern) + pattern.Length));
}
}
或
string pattern = "Current Program(s):";
lstTest.Items.AddRange(File.ReadLines(@"C:\Users\ODuritsyn\Source\demo.xml")
.Where(line => line.Contains(pattern))
.Select(line => line.Substring(line.IndexOf(pattern) + pattern.Length)));