문제

최근에 프로토콜 버퍼에 대해 알게되었고 특정 문제에 적용될 수 있는지 궁금했습니다.

기본적으로 일부 파일이 여러 공연이므로 스토리지를 위해보다 컴팩트 한 형식으로 변환 해야하는 CSV 데이터가 있습니다.

CSV의 각 필드에는 헤더가 있으며 두 가지 유형의 문자열 및 소수점 만 있습니다 (때로는 중요한 숫자가 많고 모든 숫자를 같은 방식으로 처리해야하기 때문에). 그러나 각 파일마다 각 필드마다 열 이름이 다릅니다.

원래 CSV 데이터를 캡처 할뿐만 아니라 저장하기 전에 파일에 추가 정보를 추가 할 수 있어야합니다. 그리고 나는 다른 파일 버전을 처리 하여이 미래의 증거를 만들고 싶었습니다.

그렇다면 프로토콜 버퍼를 사용하여 CSV 파일과 같이 무작위로 명명 된 데이터 열을 캡처 할 수 있습니까?

도움이 되었습니까?

해결책

글쎄, 그것은 확실히 대표 할 수 있습니다. 같은 것 :

message CsvFile {
    repeated CsvHeader header = 1;
    repeated CsvRow row = 2;
}

message CsvHeader {
    require string name = 1;
    require ColumnType type = 2;
}

enum ColumnType {
    DECIMAL = 1;
    STRING = 2;
}

message CsvRow {
    repeated CsvValue value = 1;
}

// Note that the column is implicit based on position within row    
message CsvValue {
    optional string string_value = 1;
    optional Decimal decimal_value = 2;
}

message Decimal {
    // However you want to represent it (there are various options here)
}

나는 그것이 얼마나 많은 혜택을 제공 할 것인지 잘 모르겠습니다. 당신은 확실히 더 많은 정보를 추가 할 수 있으며 (CSVFile 메시지에 추가) 향후 교정은 "일반적인 PB 방식"에 있습니다 - 선택 필드를 추가합니다.

다른 팁

글쎄, Protobuf-Net (내 버전)은 일반 .NET 유형을 기반으로하므로 (항상 다른 스키마에 대처하지 않기 때문에) 아니요. 그러나 Jon의 버전은 동적 유형을 허용 할 수 있습니다. 개인적으로, 나는 단지 CSV를 사용하고 gzipstream을 통해 실행합니다. 목적에 맞는 것이 좋을 것으로 기대합니다.


편집 : 실제로, 나는 잊어 버렸다 : protobuf-net은 확장 가능한 객체를 지원하지만 약간 조심해야합니다 ... 전체 컨텍스트에 따라 다릅니다.

또한 중첩 된 데이터에 대한 Jon의 접근도 아마도 효과가있을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top