我从文件系统中读取一个文件并将其FTP发送到FTP服务器。我现在请求跳过第一行(它是带有标题信息的 CSV)。我想我可以以某种方式用流的偏移量来做到这一点。读取方法(或写入方法),但我不确定如何从一行转换字节数组偏移量。
我将如何计算偏移量以告诉它仅从文件的第二行读取?
谢谢
// 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;
您应该使用 File.ReadAllLines。它返回字符串数组。然后,只需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();
}
如果你只需要跳过一行,你可以使用阅读器类,阅读行,获取当前位置并像往常一样阅读内容。
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
吗?
您可以从流输入中获取字符串,将其解析为具有数组拆分的行,然后删除第一个,然后将其重新组合在一起,或者,您可以正则表达式出第一行,或者只是查找换行符并从那里复制字符串。
你应该使用 [StreamReader][1]
类。然后通过使用 ReadLine 直到结果为 null,您可以逐一读取所有行。只需保留第一个即可满足您的要求。读取内存中的所有文件通常不是一个好主意(随着文件变大,它不会扩展)
暴力方法是遍历源字节数组并查找回车符的第一个匹配项,后跟换行符 (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;
}
}
请注意,此示例假定源 CSV 文件是在 Windows 上创建的,因为换行符在其他平台上的表达方式不同。
相关资源:
- 环境.换行符属性