这是我正在使用的代码
using (FileStream fs = new FileStream(filename, FileMode.Open))
using (StreamReader rdr = new StreamReader(fs))
{
while (!rdr.EndOfStream)
{
for (int z = 0; z < 2; z++)
{
string[] lines = rdr.ReadLine().Split('|');
{
sb.AppendLine(";Re");
sb.AppendLine("@C PAMT " + lines[3]);
sb.AppendLine("@T " + lines[0]);
sb.AppendLine("@D @I\\" + lines[1]).Replace("I:\\", "");
sb.AppendLine(lines[2].Replace(";", "\r\n");
}
}
}
}
using (FileStream fs = new FileStream(outputfilename, FileMode.Create))
using (StreamWriter writer = new StreamWriter(fs))
{
writer.Write(sb.ToString());
}
我想要的是跳过StreamReader的第一行或跳过整个第一个stringbuilder。我认为for会这样做,但它没有。
注意:我想推荐一个foreach。
答案 0 :(得分:20)
为什么不在创建rdr
变量后立即添加以下行?
if ( !rdr.EndOfStream ) {rdr.ReadLine();}
答案 1 :(得分:7)
为什么不只读第一行而不做任何事情?
using (StreamReader rdr = new StreamReader(fs))
{
rdr.ReadLine();
...
或者如果您不想这样做,请使用外部变量i并测试i!= 0
答案 2 :(得分:4)
怎么样
if(z > 0)
{
// All of your sb.Append stuff
}
编辑:
using (FileStream fs = new FileStream(filename, FileMode.Open))
using (StreamReader rdr = new StreamReader(fs))
{
bool passedFirstline = false;
while (!rdr.EndOfStream)
{
string[] lines = rdr.ReadLine().Split('|');
if(passedFirstLine)
{
sb.AppendLine(";Re");
sb.AppendLine("@C PAMT " + lines[3]);
sb.AppendLine("@T " + lines[0]);
sb.AppendLine("@D @I\\" + lines[1]).Replace("I:\\", "");
sb.AppendLine(lines[2].Replace(";", "\r\n");
}
else
{
passedFirstLine = true;
}
}
}
using (FileStream fs = new FileStream(outputfilename, FileMode.Create))
using (StreamWriter writer = new StreamWriter(fs))
{
writer.Write(sb.ToString());
}
答案 3 :(得分:1)
我知道不是每个人都喜欢使用continue关键字,但在这种情况下,由于可读性,我几乎喜欢它。您可以更改以下代码以使用继续:
string[] lines = rdr.ReadLine().Split('|');
{
if (z == 0) continue; // Skip first line
sb.AppendLine(";Re");
sb.AppendLine("@C PAMT " + lines[3]);
sb.AppendLine("@T " + lines[0]);
sb.AppendLine("@D @I\\" + lines[1]).Replace(@"I:\", "");
sb.AppendLine(lines[2].Replace(";", "\r\n");
}
答案 4 :(得分:0)
using (FileStream fs = new FileStream(filename, FileMode.Open))
using (StreamReader rdr = new StreamReader(fs)) {
rdr.ReadLine(); // skip the first line
string line = null;
while ((line = rdr.ReadLine()) != null) {
string[] lines = line.Split('|');
sb.AppendLine(";Re");
sb.AppendLine("@C PAMT " + lines[3]);
sb.AppendLine("@T " + lines[0]);
sb.AppendLine("@D @I\\" + lines[1]).Replace("I:\\", "");
sb.AppendLine(lines[2].Replace(";", "\r\n");
}
}
if (sb.Length == 0) return; // return if nothing was processed
using (FileStream fs = new FileStream(outputfilename, FileMode.Create))
using (StreamWriter writer = new StreamWriter(fs))
{
writer.Write(sb.ToString());
}
答案 5 :(得分:0)
如果你想在你的程序中多次使用它,那么从StreamReader继承自定义类并跳过行是一个好主意。
这样的事情可以做到:
class SkippableStreamReader : StreamReader
{
public SkippableStreamReader(string path) : base(path) { }
public void SkipLines(int linecount)
{
for (int i = 0; i < linecount; i++)
{
this.ReadLine();
}
}
}
之后你可以使用SkippableStreamReader的函数跳过行。 例如:
SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read");
//do stuff
//and when needed
exampleReader.SkipLines(number_of_lines_to_skip);