C# 如何从.NET中的x行读取文件
我从文件系统读取一个文件并将其FTP到FTP服务器。我现在有一个跳过第一行的请求(这是一个带有标题信息的CSV)。我想我可以通过stream.Read方法(或write方法)的偏移量来实现这一点,但我不确定如何从一行转换字节数组偏移量 我如何计算偏移量来告诉它只从文件的第二行读取 谢谢C# 如何从.NET中的x行读取文件,c#,.net,file,bytearray,C#,.net,File,Bytearray,我从文件系统读取一个文件并将其FTP到FTP服务器。我现在有一个跳过第一行的请求(这是一个带有标题信息的CSV)。我想我可以通过stream.Read方法(或write方法)的偏移量来实现这一点,但我不确定如何从一行转换字节数组偏移量 我如何计算偏移量来告诉它只从文件的第二行读取 谢谢 // Read the file to be uploaded into a byte array stream = File.OpenRead(currentQueuePathAndFileNa
// Read the file to be uploaded into a byte array
stream = File.OpenRead(currentQueuePathAndFileName);
var buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Close();
// Get the stream for the request and write the byte array to it
var reqStream = request.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();
return request;
您可以从流输入中获取字符串,使用数组拆分将其解析为行,然后删除第一行,并将其重新组合在一起,或者,您可以将第一行正则表达式(regex)去掉,或者只是查找换行符并从此处复制字符串。等等。您应该使用
[StreamReader][1]
类。然后通过使用ReadLine直到结果为null,您可以逐个读取所有行。按照你的要求,第一个就可以了。读取内存中的所有文件通常不是一个好主意(它不会随着文件变大而扩展)您应该使用。它返回字符串数组。然后只需strArray.Skip(1)
将返回除第一行之外的所有行
更新
代码如下:
var stringArray = File.ReadAllLines(fileName);
if (stringArray.Length > 1)
{
stringArray = stringArray.Skip(1).ToArray();
var reqStream = request.GetRequestStream();
reqStream.Write(stringArray, 0, stringArray.Length);
reqStream.Close();
}
蛮力方法是迭代源字节数组,并查找第一个出现的回车字符,后跟换行符(CR+LF)。这样,您将知道源数组中排除CSV文件中第一行的偏移量 下面是一个例子:
const byte carriageReturn = 13;
const byte lineFeed = 10;
byte[] file = File.ReadAllBytes(currentQueuePathAndFileName);
int offset = 0;
for (int i = 0; i < file.Length; i++)
{
if (file[i] == carriageReturn && file[++i] == lineFeed)
{
offset = i + 2;
break;
}
}
常量字节返回=13;
常量字节换行=10;
byte[]file=file.ReadAllBytes(currentQueuePathAndFileName);
整数偏移=0;
for(int i=0;i
请注意,此示例假定源CSV文件是在Windows上创建的,自
相关资源:
using (var stream = File.OpenRead("currentQueuePathAndFileName"))
using (var reader = new StreamReader(stream))
{
reader.ReadLine();
Console.Write(stream.Position);
var buffer = new byte[stream.Length - stream.Position];
stream.Read(buffer, 0, buffer.Length);
var reqStream = request.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();
return request;
}
为什么要使用
RequestStream
?您不应该使用HttpContext.Current.Response.OutputStream
?+1作为KISS解决方案。如果我们有一个文件,那就更棒了。ReadAllLinesLazy()谢谢-但是我该如何把它变成缓冲区呢?我还需要将缓冲区写入FTP服务器(reqStream.write(buffer,0,buffer.Length);),当我尝试.Skip(1)LINQ方法时,它不会返回任何记录:var lines1=lines.Skip(1);(lines是一个字符串[],包含32个条目(行),但lines1的计数为0?好的,我对LINQ不太熟悉。我明白了你的意思:但是,我仍然必须读取它并将其转换为一个带有流的缓冲区-如何一次性完成这些操作?var newLines=行中的x。跳过(1)选择x;File.writeAllines(currentQueuePathAndFileName,newLines.ToArray());谢谢Eugene,这非常简洁!我正在使用它,然后我仍然必须按照我的原始代码将它读入缓冲流(所以我要读取两次文件。你是否可以混合文件读取方法并输出流缓冲区(如下面的答案),这样我就不必两次解析文件了?)这似乎是我想要的,谢谢。但是,在reader.Readline()之后,流.Position被写为文件的结尾(我制作了一个只有几行的测试文件.csv,它总是在reader.ReadLine()之后前进到EOF,这意味着生成的文件是空的).WRT到为什么它是RequestStream-我不知道-我在某个地方找到了将文件FTPing到FTP服务器的代码,它可以工作。这可能是因为它可以在带有LineEnd的文本文件上工作,但不能在CSV文件上工作,因为Excel对新行的处理方式不同吗?在我的系统上,它可以工作,但可能确实需要开发