You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.7 KiB
C

1 month ago
#pragma once
#include "stdafx.h"
#include <vector>
#include <map>
/**
* @brief TSVTab
*
* TSV
* TSV
*/
class TsvParser
{
public:
/**
* @brief
*
*
*/
struct TableData
{
std::vector<CString> headers; // 列头
std::vector<std::vector<CString>> rows; // 数据行
std::map<CString, int> columnIndexMap; // 列名到索引的映射(不区分大小写)
/**
* @brief
* @param columnName
* @return -1
*/
int GetColumnIndex(const CString& columnName) const;
/**
* @brief
* @param row
* @param columnName
* @return Trim
*/
CString GetValue(const std::vector<CString>& row, const CString& columnName) const;
/**
* @brief
* @param row
* @param columnIndex
* @return Trim
*/
CString GetValue(const std::vector<CString>& row, int columnIndex) const;
/**
* @brief double
* @param row
* @param columnName
* @param defaultValue 使
* @return double
*/
double GetDoubleValue(const std::vector<CString>& row, const CString& columnName, double defaultValue = 0.0) const;
/**
* @brief
*/
bool IsEmpty() const { return rows.empty(); }
/**
* @brief
*/
size_t GetRowCount() const { return rows.size(); }
};
public:
/**
* @brief TSV
* @param tsvData TSV 使 Tab
* @param outTableData
* @return
*/
static bool Parse(const CString& tsvData, TableData& outTableData);
private:
/**
* @brief
* @param data
* @param outLines
*/
static void SplitLines(const CString& data, std::vector<CString>& outLines);
/**
* @brief TSV
* @param line
* @param outFields
* @return
*/
static bool ParseLine(const CString& line, std::vector<CString>& outFields);
/**
* @brief
* @param headers
* @param outIndexMap
*/
static void BuildColumnIndexMap(const std::vector<CString>& headers,
std::map<CString, int>& outIndexMap);
};