Как прочитать файл из строки x в .NET - PullRequest
4 голосов
/ 23 мая 2011

Я читаю файл из файловой системы и отправляю его на FTP-сервер.Теперь у меня есть просьба пропустить первую строку (это CSV с информацией заголовка).Я думаю, что я могу как-то сделать это с помощью метода Offset метода stream.Read (или метода write), но я не уверен, как преобразовать смещение байтового массива из одной строки.

Как бы я вычислилсмещение, чтобы сказать это только для чтения из 2-й строки файла?

Спасибо

// 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;

Ответы [ 5 ]

5 голосов
/ 23 мая 2011

Вы должны использовать 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();       
}
1 голос
/ 23 мая 2011

Если вам нужно просто пропустить одну строку, вы можете использовать класс считывателя, прочитать строку, получить текущую позицию и прочитать содержимое как обычно.

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?

0 голосов
/ 23 мая 2011

Подход методом грубой силы состоит в том, чтобы перебирать исходный байтовый массив и искать первое вхождение символа возврата каретки, за которым следует перевод строки (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 , поскольку разрывы строк выражаются по-разному на других платформах .

Связанные ресурсы:

0 голосов
/ 23 мая 2011

Вы должны использовать класс [StreamReader][1].Затем, используя ReadLine, пока результат не станет нулевым, вы читаете все строки по одной.Просто запишите первый как ваше требование.Чтение всего файла в памяти, как правило, не очень хорошая идея (он не масштабируется, когда файл становится больше)

0 голосов
/ 23 мая 2011

Вы можете взять строку из входного потока, разобрать ее на строки с разбивкой по массиву, а затем отбросить первую и снова собрать ее вместе, ИЛИ, вы можете отсканировать первую строку или просто найти перевод строки. и скопируйте строку оттуда. и т.д.

...