Создайте индекс диапазона байтов файла CSV для чтения из S3 построчно - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть большие (10-100 ГБ) файлы журналов CSV / Text в моем S3 Bucket, загружаемые каждый день, и amazon S3 поддерживает заголовок диапазонов байтов RFC-7233 для частичного чтения файла вместо загрузки всего объекта.

var s3request = new GetObjectRequest()
                {
                    BucketName = bucketName,
                    Key = s3Key,
                    ByteRange = new ByteRange(byteStart, byteEnd)
                };

Можно ли как-нибудь создать индекс для каждого файла-каждой-строки и сохранить в таблице для использования в качестве ссылки на нумерацию страниц?Например, байты 1 - 100: 1-я строка, 101 - 200: 2-я строка и т. Д.

И затем, если мне нужно прочитать первые 2 строки, я могу проверить индекс, чтобы получить диапазон байтов, а затем отправитьчто в ByteRange header

Пример CSV-файла

Field1, Field2
a, b
c, d
e, f
g, h
i, j
k, l
x, y

Пример индекса

Row, ByteStart, ByteEnd
1, 0, 100
2, 101, 200
3, 201, 300

Я ищусоздать индекс диапазона байтов в C # перед загрузкой отчета в S3.Будем благодарны за любую помощь или предложение.

Моя попытка создать индекс

void Main()
{
    string path = @"Y:\temp\test-file.txt"; 
    var index = new List<RowIndex>();
    // Read file by skipping the header
    var lines = File.ReadLines(path).Skip(1);
    long rowNumber = 1;
    foreach(var line in lines)
    {
        // How to get the byteStart + byteEnd for this line ?

        index.Add(new RowIndex {rowNumber = rowNumber, byteStart = ? , byteEnd = ? });
        rowNumber++;
    }
    // Print the index  
}

public class RowIndex
{
    public long rowNumber {get; set;}
    public long byteStart {get;set;}
    public long byteEnd {get;set;}  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...