Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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/20.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# 创建CSV文件的字节范围索引以逐行从S3读取_C#_.net_Amazon Web Services_Amazon S3 - Fatal编程技术网

C# 创建CSV文件的字节范围索引以逐行从S3读取

C# 创建CSV文件的字节范围索引以逐行从S3读取,c#,.net,amazon-web-services,amazon-s3,C#,.net,Amazon Web Services,Amazon S3,我每天在S3存储桶中上传大量(10-100gb)CSV/文本日志文件,AmazonS3支持RFC-7233字节范围头部分读取文件,而不是下载完整的对象 var s3request = new GetObjectRequest() { BucketName = bucketName, Key = s3Key, ByteRange = new Byt

我每天在S3存储桶中上传大量(10-100gb)CSV/文本日志文件,AmazonS3支持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
我希望在将报告上载到S3之前,在C#中创建字节范围索引。任何帮助或建议都将不胜感激

我尝试创建索引

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;}  
}
void Main()
{
字符串路径=@“Y:\temp\test file.txt”;
var index=新列表();
//通过跳过头读取文件
var lines=File.ReadLines(path).Skip(1);
长行数=1;
foreach(行中的var行)
{
//如何获取此线路的byteStart+byteEnd?
Add(新行索引{rowNumber=rowNumber,byteStart=?,byteEnd=?});
行数++;
}
//打印索引
}
公共类行索引
{
公共长行数{get;set;}
公共长byteStart{get;set;}
公共长byteEnd{get;set;}
}

这些范围是换行符或任何您想要的行终止符的位置。但是,您必须扫描整个文件一次才能找到这些位置。您将如何使用这些文件?它是在您自己的应用程序中,还是通过类似Amazon Athena/Amazon EMR这样的查询工具?这类工具可以读取更高效的文件格式,如ORC和Parquet,它们在定位数据方面效率更高。这些文件将在我的Web API中读取。例如/api/reader?name=abc.csv&offset=0&limit=100@PanagiotisKanavos只是“否”的新行,因为它们是csv/分隔文件,所以“/n”表示新行开始,但我也希望使用自定义终止符。您只需要存储行开始的列表。该行显然在下一个
RowStart-1
处结束。第一个条目是第一行,第二个条目是第二行,以此类推,所以您甚至不需要行号。坦率地说,您打算如何使用该指数是最重要的因素。根据您将如何使用它,您可能不需要每行—您可能只需要每100行,或者可能需要日期转换到第二天的行。通过思考您以后需要什么,然后将其提供给客户,来回过头来想出最佳解决方案。