LOADING

加载过慢请开启缓存 浏览器默认开启

csv文件解析

2024/7/23 csv csv

CSV简单的读取

CSV代表Comma Separated Values。CSV文件是一种纯文本文件,用于存储表格和电子表格信息。内容通常是由文本、数字或日期组成的表格。使用将数据存储在表中的程序可以轻松导入和导出CSV文件。

CSV文件格式

通常CSV文件的第一行包含表格列标签。后面的每一行表示表中的一行。逗号分隔行中的每个单元格,这就是名称的来源。

下面是一个CSV文件的示例。

正常txt文本打开(程序读取的形式)

img

电子表格形式

img

其实读取csv文件就是读取正常的字符串文件,就是记住csv格式

每一行的每个对象之间用逗号分割,行与行之间就是换行符,不用逗号,塔防游戏就用来存放地图瓦片数据

直接根据实例解释

bool load(const std::string& path)
{	
    std::fstream file(path);			
    if (!file.good())return false;		

    TileMap tile_map_temp;

    int idx_x = -1, idx_y = -1;	
    std::string str_line;		
    while (std::getline(file, str_line))									
    {
    
        str_line = trim_str(str_line);						
        if (str_line.empty())								
            continue;

        idx_x = -1, idx_y++;
        tile_map_temp.emplace_back();
        std::string str_tile;								
        std::stringstream str_stream(str_line);				
        while (std::getline(str_stream,str_tile,','))		
        {
            idx_x++;
            tile_map_temp[idx_y].emplace_back();			
            Tile& tile = tile_map_temp[idx_y].back();		
            load_tile_from_string(tile, str_tile);

        }
    }
    file.close();

    if (tile_map_temp.empty() || tile_map_temp[0].empty())	
        return false;										

    
    tile_map = tile_map_temp;								
    generate_map_cache();
    return true;
}
  1. getline(file, str_line)

    一行一行读取csv文件,读入string类,一行的内容指导换行符,为了保证读取争取必须删除最后的的可能存在的空格

    std::string trim_str(const std::string& str)
    {
        
        size_t begin_idx = str.find_first_not_of(" \t");	//该函数时返回第一个不在提供字符串的字符索引
        if (begin_idx == std::string::npos)					//npos表示查询越界全空,返回空字符串
            return "";
    
        size_t end_idx = str.find_last_not_of(" \t");		//找到最后的一个不是换行或者空格
        size_t idx_range = end_idx - begin_idx + 1;			//计算有效字符串的范围
    
        return str.substr(begin_idx, idx_range);			//截取需要的字符串
        
        //“2/2,3/2,3/2      ”->处理后“2/2,3/2,3/2”(空格没了)
    }
    
  2. 然后依次以逗号为分割符依次读取每一个瓦片数据

while (std::getline(str_stream,str_tile,','))

然后瓦片又以“/”为分隔符读取

while (std::getline(str_stream, str_value, '\\'))		//从str_stream中逐个读取到str_value,,然后去转换