Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从.NET中的x行读取文件_C#_.net_File_Bytearray - Fatal编程技术网

C# 如何从.NET中的x行读取文件

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

我从文件系统读取一个文件并将其FTP到FTP服务器。我现在有一个跳过第一行的请求(这是一个带有标题信息的CSV)。我想我可以通过stream.Read方法(或write方法)的偏移量来实现这一点,但我不确定如何从一行转换字节数组偏移量

我如何计算偏移量来告诉它只从文件的第二行读取

谢谢

// 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上创建的,自

相关资源:


如果您只需要跳过这一行,您可以使用reader类,阅读这一行,获取当前位置并像往常一样阅读内容

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对新行的处理方式不同吗?在我的系统上,它可以工作,但可能确实需要开发