我是一名初学c#程序员,对我正在构建的应用程序有一个快速的问题。我的进程读入多个文件,目的是根据文本文件中的1或0管道分隔字段删除特定记录。它实际上是文件中的最后一个分隔字段。如果它是0,我将它写入临时文件(稍后将替换我读取的原始文件),如果它是我没有的其他内容。而不是试图让它太混乱,但文件中有两种类型的记录,一个标题行,然后是几个支持行。标题行是唯一具有该标志的行,因此您可以从下面看出,如果bool通过为0设置为良好记录,它会将标题记录与其下面的所有supp记录一起写入,直到它遇到错误在这种情况下,它将否定写入它们直到下一个好的。
但是,我现在要做的事情(并且想知道最简单的方法)是如何在没有最后一个管道分隔字段(IE标志)的情况下编写标题记录。因为它应该始终是行的最后2个字符(例如" 0 |"或" 1 |"因为需要前面的管道),它应该是字符串修剪在我的inputrecord字符串?有没有更简单的方法?有没有办法在记录上进行拆分但实际上不包括最后一个字段(在本例中为字段36)?任何意见,将不胜感激。谢谢,
static void Main(string[] args)
{
try
{
string executionDirectory = RemoveFlaggedRecords.Properties.Settings.Default.executionDirectory;
string workDirectory = RemoveFlaggedRecords.Properties.Settings.Default.workingDirectory;
string[] files = Directory.GetFiles(executionDirectory, "FilePrefix*");
foreach (string file in files)
{
string tempFile = Path.Combine(workDirectory,Path.GetFileName(file));
using (StreamReader sr = new StreamReader(file,Encoding.Default))
{
StreamWriter sw = new StreamWriter(tempFile);
string inputRecord = sr.ReadLine();
bool goodRecord = false;
bool isheaderRecord = false;
while (inputRecord != null)
{
string[] fields = inputRecord.Split('|');
if (fields[0].ToString().ToUpper() == "HEADER")
{
goodRecord = Convert.ToInt32(fields[36]) == 0;
isheaderRecord = true;
}
if (goodRecord == true && isheaderRecord == true)
{
// I'm not sure what to do here to write the string without the 36th field***
}
else if (goodRecord == true)
{
sw.WriteLine(inputRecord);
}
inputRecord = sr.ReadLine();
}
sr.Close();
sw.Close();
sw = null;
}
}
string[] newFiles = Directory.GetFiles(workDirectory, "fileprefix*");
foreach (string file in newFiles)
{
string tempFile = Path.Combine(workDirectory, Path.GetFileName(file));
string destFile = Path.Combine(executionDirectory, Path.GetFileName(file));
File.Copy(tempFile, destFile, true);
if (File.Exists(destFile))
{
File.Delete(tempFile);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
finally
{
// not done
}
}
答案 0 :(得分:4)
你可以这样做的一种方法 - 如果代码中你想要的是总是写出除string[]
中的最后一个元素之外的所有元素 - 构造一个for
循环,它在最后一项:
for (int i = 0; i < fields.Length - 1; i++)
{
// write your field here
}
这假设您要单独编写每个字段,并且首先想要遍历fields
。如果您只想在不使用循环的情况下将单个字符串写入单行,则可以执行以下操作:
var truncatedFields = fields.Take(fields.Length - 1);
然后根据需要编写truncatedFields
string[]
。你可以在一行中完成所有这些的一种方式可能是这样的:
sw.WriteLine(String.Join("|", fields.Take(fields.Length - 1)));
答案 1 :(得分:0)
goodRecord = fields.Last()。Trim()==“0”;
if(inputRecord.Contains(“|”)string outputRecord = inputRecord.Substring(1,inputRecord.LastIndexOf(“|”));