csv文件解析

CSV简单的读取

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

CSV文件格式

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

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

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

img

电子表格形式

img

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

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

直接根据实例解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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类,一行的内容指导换行符,为了保证读取争取必须删除最后的的可能存在的空格

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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. 然后依次以逗号为分割符依次读取每一个瓦片数据

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

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

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

yang

发布于

2024-07-23

更新于

2024-07-23

许可协议

评论