博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang解析CSV
阅读量:6469 次
发布时间:2019-06-23

本文共 2661 字,大约阅读时间需要 8 分钟。

Golang的csv库支持解析csv文件,导入encoding/csv就可以用了,但本身不太好用,特别是当CSV表列的顺序被打乱后,还得改动代码里面对应列在解析出的数据的索引,所以就这两个问题,简单封装了下,使之用起来更加方便,代码如下:

1 package csvMgr 2  3 import ( 4     "encoding/csv" 5     "os" 6     "strconv" 7  8     "github.com/astaxie/beego" 9 )10 11 type CsvTable struct {12     FileName string13     Records  []CsvRecord14 }15 16 type CsvRecord struct {17     Record map[string]string18 }19 20 func (c *CsvRecord) GetInt(field string) int {21     var r int22     var err error23     if r, err = strconv.Atoi(c.Record[field]); err != nil {24         beego.Error(err)25         panic(err)26     }27     return r28 }29 30 func (c *CsvRecord) GetString(field string) string {31     data, ok := c.Record[field]32     if ok {33         return data34     } else {35         beego.Warning("Get fileld failed! fileld:", field)36         return ""37     }38 }39 40 func LoadCsvCfg(filename string, row int) *CsvTable {41     file, err := os.Open(filename)42     if err != nil {43         beego.Error(err)44         return nil45     }46     defer file.Close()47 48     reader := csv.NewReader(file)49     if reader == nil {50         beego.Error("NewReader return nil, file:", file)51         return nil52     }53     records, err := reader.ReadAll()54     if err != nil {55         beego.Error(err)56         return nil57     }58     if len(records) < row {59         beego.Warning(filename, " is empty")60         return nil61     }62     colNum := len(records[0])63     recordNum := len(records)64     var allRecords []CsvRecord65     for i := row; i < recordNum; i++ {66         record := &CsvRecord{make(map[string]string)}67         for k := 0; k < colNum; k++ {68             record.Record[records[0][k]] = records[i][k]69         }70         allRecords = append(allRecords, *record)71     }72     var result = &CsvTable{73         filename,74         allRecords,75     }76     return result77 }

使用示例:

有一张Award表,结构如下:

定义一个结构体来表示这个配置表的一行数据

1 type AwardCfg struct {2     Id   int3     Type int4     Val  int5     Text string6 }

使用上面的封装解析代码如下:

var g_allAwardCfg map[int]*AwardCfgfunc LoadAwardCfg() bool {    var result = LoadCsvCfg("csvmgr/award.csv", 2)    if result == nil {        return false    }    g_allAwardCfg = make(map[int]*AwardCfg)    for _, record := range result.Records {        id := record.GetInt("Id")        aWard := &AwardCfg{            id,            record.GetInt("Type"),            record.GetInt("Value"),            record.GetString("Text"),        }        g_allAwardCfg[id] = aWard    }    return true}

另外,用golang的CSV库解析CSV文件有特别注意一个问题,文档的格式一定要是不带BOM的UTF-8格式,不用UTF-8解析中文会乱码,带了BOM会导致第一个字段解析不出来。

 

转载于:https://www.cnblogs.com/zengyg/p/11020654.html

你可能感兴趣的文章
App工程结构搭建:几种常见Android代码架构分析
查看>>
使用openssl进行证书格式转换
查看>>
ZOJ 3777 Problem Arrangement
查看>>
HTML中动态生成内容的事件绑定问题【转载】
查看>>
虚拟机类加载机制
查看>>
Callable和Future
查看>>
installshield12如何改变默认安装目录
查看>>
少用数字来作为参数标识含义
查看>>
ScrollView中嵌套ListView
查看>>
JAVA虚拟机05--面试必问之JVM原理
查看>>
Algs4-2.3.1如何切分数组
查看>>
uva 10815 - Andy's First Dictionary(快排、字符串)
查看>>
观察者模式
查看>>
SQL性能优化:如何定位网络性能问题
查看>>
在properties.xml中定义变量,在application.xml中取值问题
查看>>
js 数组
查看>>
Linux scp命令详解
查看>>
struct和typedef struct
查看>>
RPC框架Thrift例子-PHP调用C++后端程序
查看>>
cell reuse & disposebag
查看>>