我看过,但找不到可以解决我问题的教程。也许我没有正确地说出我的搜索。无论如何,我在这里。
我接管了一家杂工公司,他有大约150名客户。他有一个他买的程序,为他的客户创造了记录。我有记录,但他不会把这个程序卖给我,因为它是商业性的,而且他害怕因出售类似的东西而入狱......无论如何......它们是用文本文件写的。格式似乎是:
string name
string last_job_description
int job_codes
string job_address
string comments
文本文件如下所示
*Henderson*
*Cleaned gutters, fed the lawn, added mulch to the front flower beds,
cut the back yard, edged the side walk, pressure washed the driveway*
*04 34 32 1 18 99 32 22 43 72 11 18*
*123 Anywhere ave*
*Ms.always pays cash no tip. Mr. gives you a check but always tips*
好吧..我的问题是在C#中我想编写一个程序来编辑这些记录,添加新客户并删除一些我可能丢失,移动或死亡......但是第二个条目分为两行,有时候3和4行。它们都以*开头和结尾。那么,我如何读取2到4行并将它们放入last_job_description字符串变量中?我可以写课,我可以读行,我可以删掉星号。在将多行读入单个变量时,我什么都找不到。
答案 0 :(得分:0)
如果你想将文件中的所有行读成单个变量,那么你需要这样做
var txt = File.ReadAllText(.. your file location here ..);
或者你可以做
var lines = File.ReadAllLines(.. your file location here);
然后您可以遍历每一行并删除原样的空白。
但根据你的问题,第一行是你真正追求的
答案 1 :(得分:0)
当您阅读last_job_description
时,请阅读第二行。如果它以*开头,则意味着该行为job_codes
,否则将其附加到pervous读取行。在找到job_codes
之前,每行都这样做。
using (var fileReader = new StreamReader("someFile"))
{
// read some pervous data here
var last_job_description = fileReader.ReadLine();
var nextLine = fileReader.ReadLine();
while (nextLine.StartsWith("*") == false)
{
last_job_description += nextLine;
nextLine = fileReader.ReadLine();
}
//you have job_codes in nextline, so parse it now and read next data
}
或者您甚至可以使用每组数据开始和结束的事实!使用*
,因此您可以创建读取每个“set”的函数并将其作为单行字符串返回,无论它实际上有多少行。让我们假设您传递给此函数的reader变量与上层代码中的StreamReader相同
function string readSingleValue(StreamReader fileReader){
var result = "";
do
{
result += fileReader.ReadLine().Trim();
} while (result.EndsWith("*") == false);
return result;
}
答案 2 :(得分:0)
我认为你的问题并不复杂。我想说的是它没有提到具体问题。它至少包含3个不同的编程方面,您需要了解或学习如何实现目标。您必须采取的步骤如下所述。
xml
。xml
文件,则只需更新即可。答案 3 :(得分:0)
没有内置的方法可以完全按照您的意愿解析您的文件,因此您必须弄清楚。
以下是针对特定案例的工作代码示例。我假设你想在数组中使用job_codes,因为它们是由空格分隔的多个整数。
每当我们遇到以'*'开头的行时,我们会增加一个计数器,告诉我们使用您的下一个属性(名称,上一个职位描述等)。
每一行都附加到当前属性。
显然,我们会从每行的开头和结尾删除星星。
string name = String.Empty;
string last_job_description = String.Empty;
int[] job_codes = null;
string job_address = String.Empty;
string comments = String.Empty;
int numberOfPropertiesRead = 0;
var lines = File.ReadAllLines("C:/yourfile.txt");
for (int i = 0; i < lines.Count(); i++)
{
var line = lines[i];
bool newProp = line.StartsWith("*");
bool endOfProp = line.EndsWith("*");
if (newProp)
{
numberOfPropertiesRead++;
line = line.Substring(1);
}
if (endOfProp)
line = line.Substring(0, line.Length - 1);
switch (numberOfPropertiesRead)
{
case 1: name += line; break;
case 2: last_job_description += line; break;
case 3:
job_codes = line.Split(' ').Select(el => Int32.Parse(el)).ToArray();
break;
case 4: job_address += line; break;
case 5: comments += line; break;
default:
throw new ArgumentException("Wow, that's too many properties dude.");
}
}
Console.WriteLine("name: " + name);
Console.WriteLine("last_job_description: " + last_job_description);
foreach (int job_code in job_codes)
Console.Write(job_code + " ");
Console.WriteLine();
Console.WriteLine("job_address: " + job_address);
Console.WriteLine("comments: " + comments);
Console.ReadLine();
答案 4 :(得分:0)
让我们做对了!
首先定义客户模型:
public class Customer
{
public string Name { get; set; }
public string LastJobDescription { get; set; }
public List<int> JobCodes { get; set; }
public string JobAddress { get; set; }
public string Comments { get; set; }
}
然后,我们需要一组客户:
var customers = new List<Customer>();
使用文件中的数据填充集合:
string text = File.ReadAllText("customers.txt");
string pattern = @"(?<= ^ \*) .+? (?= \* \r? $)";
var options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled
| RegexOptions.Singleline | RegexOptions.Multiline;
var matches = Regex.Matches(text, pattern, options);
for (int i = 0; i < matches.Count; i += 5)
{
var customer = new Customer
{
Name = matches[i].Value,
LastJobDescription = matches[i + 1].Value,
JobCodes = matches[i + 2].Value.Split().Select(s => int.Parse(s)).ToList(),
JobAddress = matches[i + 3].Value,
Comments = matches[i + 4].Value
};
customers.Add(customer);
}
我使用的正则表达式允许在行的中间放置*
字符。
现在我们可以轻松地使用这个系列。
使用示例。
删除第一位客户:
customers.RemoveAt(0);
向最新客户添加评论:
customers.Last().Comments += " Very generous.";
以Henderson的名义查找客户的第一条记录,并添加所执行作业的代码:
customers.Find(c => c.Name == "Henderson").JobCodes.Add(42);
添加新客户:
var customer = new Customer
{
Name = "Chuck Norris",
LastJobDescription= "Saved the world.",
JobCodes = new List<int>() { 1 },
JobAddress = "UN",
Comments = "Nice guy!"
};
customers.Add(customer);
等等。
要将数据保存到文件,请使用以下命令:
var sb = new StringBuilder();
foreach (var customer in customers)
{
sb.Append('*').Append(customer.Name).Append('*').AppendLine();
sb.Append('*').Append(customer.LastJobDescription).Append('*').AppendLine();
sb.Append('*').Append(string.Join(" ", customer.JobCodes)).Append('*').AppendLine();
sb.Append('*').Append(customer.JobAddress).Append('*').AppendLine();
sb.Append('*').Append(customer.Comments).Append('*').AppendLine();
}
File.WriteAllText("customers.txt", sb.ToString());
您可能需要图形用户界面。如果是这样,我建议您提出一个新问题,您可以在其中指定您使用的内容:WinForms,WPF,Web应用程序或其他内容。