要用到的包:

"golang.org/x/text/encoding/simplifiedchinese"
    "golang.org/x/text/transform"

func Decode(s []byte) ([]byte, error) {
    I := bytes.NewReader(s)
    O := transform.NewReader(I, simplifiedchinese.GBK.NewDecoder())
    d, e := ioutil.ReadAll(O)
    if e != nil {
        return nil, e
    }
    return d, nil
}
func ReadCsv(execlFileName string) {
    ProBar.Exist = 0
    ProBar.Sucess = 0
    ProBar.Fail = 0
    ProBar.Count = 0

    var (
        err        error
        sucess     int64
        fail       int64
        exist      int64
        errcontent string
        OrderTime  time.Time
        tradedata  []TradeData
    )

    cntb, err := ioutil.ReadFile(execlFileName)
    ress, err := Decode(cntb)
    if err != nil {
        beego.Error("change is err", err.Error())
        return
    }
    buffer := bytes.NewBuffer(ress)
    bufferline := bytes.NewBuffer(ress)
    var cols int
    for {
        s, err := bufferline.ReadString(byte('\n'))
        if err != nil {
            beego.Error("err", err)
            break
        } else {
            linestr := strings.Split(s, ",")
            if len(linestr) > 5 && len(linestr[1]) > 5 {
                cols++
            }
        }
    }
    ProBar.TotalPro = int64((cols - 1) * 3)
    var linenum int
    for {
        s, err := buffer.ReadString(byte('\n'))
        if err != nil {
            beego.Error("err", err)
            break
        } else {
            if linenum > 0 {
                linestr := strings.Split(s, ",")
                if len(linestr) > 5 && len(linestr[1]) > 5 {
                    beego.Debug("linestr lenght:", len(linestr))

                    var (
                        trade TradeData
                    )
                    for i := 0; i < len(linestr); i++ {
                        str := linestr[i]
                        if strings.TrimSpace(str) != "" {
                            ProBar.CurrentPro++
                            // for i := 0; i < len(str); i++ {
                            if strings.TrimSpace(linestr[i]) != "" {
                                trimsrt := strings.TrimRight(strings.TrimLeft(linestr[i], `="`), `"`)

                                beego.Debug("str : i", i, trimsrt)
                                if i == 1 {
                                    customercode, _ := strconv.ParseFloat(trimsrt, 64) //客户账号
                                    trade.CustomerCode = int64(customercode)           //客户账号
                                }
                                if i == 2 {
                                    trade.CustomerName = trimsrt //账户名称
                                }
                                if i == 3 {
                                    trade.SuccessOrderCode = trimsrt //成交单号
                                }
                                if i == 4 {
                                    trade.CommodityCode = trimsrt //成交代码
                                }
                                if i == 5 {
                                    trade.CommodityName = trimsrt //商品名称
                                }
                                if i == 6 {
                                    switch trimsrt {
                                    case "买":
                                        trade.TradeType = 1 //交易类型(0-未知,1-买,2-卖)
                                        break
                                    case "卖":
                                        trade.TradeType = 2 //交易类型(0-未知,1-买,2-卖)
                                        break
                                    default:
                                        trade.TradeType = 0 //交易类型(0-未知,1-买,2-卖)
                                        if trade.TradeType == 0 {
                                            fail++
                                            beego.Debug("Transaction type error : ", linestr[i])
                                            errcontent = errcontent + strconv.Itoa(i) + "行买卖类型错误"
                                            break
                                        }
                                    }
                                }
                                if i == 7 {
                                    trade.OrderCode = trimsrt //委托单号
                                }
                                if i == 8 {
                                    trancount, _ := strconv.ParseFloat(trimsrt, 64) //成交数量
                                    trade.TranCount = int64(trancount)
                                }
                                if i == 9 {
                                    trade.TranPrice, _ = strconv.ParseFloat(trimsrt, 64) //成交价格
                                }
                                if i == 10 {
                                    trade.TranAmount, _ = strconv.ParseFloat(trimsrt, 64) //成交金额
                                }
                                if i == 11 {
                                    tranuser, _ := strconv.ParseFloat(trimsrt, 64) //交易员
                                    trade.TranUser = int64(tranuser)               //交易员
                                }
                                if i == 12 {
                                    loc, _ := time.LoadLocation("Local")                                             //重要:获取时区
                                    trade.TradeTime, err = time.ParseInLocation("2006-01-02 15:04:05", trimsrt, loc) //成交时间
                                    if err != nil {
                                        fail++
                                        beego.Debug("TradeTime wrong time : ", trimsrt)
                                        errcontent = errcontent + strconv.Itoa(i) + "行 时间格式错误"
                                        break
                                    }
                                }
                                if i == 13 {
                                    trade.ProfitLoss, _ = strconv.ParseFloat(trimsrt, 64) //转让盈亏
                                }
                                if i == 14 {
                                    trade.PoundAge, _ = strconv.ParseFloat(trimsrt, 64) //手续费
                                }

                                if i >= 15 && strings.TrimSpace(trimsrt) != "" {
                                    if i == 15 {
                                        trade.OrderPrice, _ = strconv.ParseFloat(trimsrt, 64) //订立价格
                                    }
                                    if i == 16 {
                                        loc, _ := time.LoadLocation("Local")
                                        OrderTime, err = time.ParseInLocation("2006-01-02 15:04:05", trimsrt, loc) //订立时间
                                        trade.OrderTime = OrderTime.Unix()
                                        if err != nil {
                                            fail++
                                            beego.Debug("TradeTime wrong time : ", trimsrt)
                                            errcontent = errcontent + strconv.Itoa(i) + "行 时间格式错误"
                                            break
                                        }
                                    }
                                }
                            }
                        }
                    }
                    beego.Debug("trade", linenum, trade)
                    checktime := trade.TradeTime.Format("2006-01-02") //登入的时间
                    IsExist := CheckIsTradeData(checktime)
                    if !IsExist {
                        tradedata = append(tradedata, trade)
                        sucess++
                    } else {
                        exist++
                        beego.Debug("Database duplicate data : ", trade)
                        errcontent = errcontent + strconv.Itoa(linenum) + "行 数据库重复"
                    }
                }
            }
            time.Sleep(time.Millisecond * 0)
        }
        linenum++
    }

    if sucess > 0 {
        var commitfail int64
        sucess, commitfail = AddTradeData(tradedata, sucess)
        if commitfail > 0 {
            fail = 0
            sucess = 0
            commitfail = int64(cols - 1)
        }
        fail += commitfail
        os.Remove(execlFileName) //删除文件
    }
    ProBar.Sucess = sucess
    ProBar.Fail = fail
    ProBar.Exist = exist
    ProBar.Count = int64(cols - 1)
    ProBar.ErrorContent = errcontent
    ProBar.Status = false
    ProBar.CurrentPro = ProBar.TotalPro
}

func ReadXls(excelFileName string) (res [][]string) {
    xlFile, err := xls.Open(excelFileName, "utf-8")
    if err == nil {
        beego.Debug(excelFileName, " file data read...................")
        for i := 0; i < xlFile.NumSheets(); i++ {
            sheet := xlFile.GetSheet(i)
            temp := make([][]string, sheet.MaxRow+1)
            for k, row := range sheet.Rows {
                data := make([]string, 0)
                for _, col := range row.Cols {
                    if uint16(len(data)) <= col.LastCol() {
                        data = append(data, make([]string, col.LastCol()-uint16(len(data))+1)...)
                    }
                    str := col.String(xlFile)
                    for i := uint16(0); i < col.LastCol()-col.FirstCol()+1; i++ {
                        data[col.FirstCol()+i] = str[i]
                    }
                }
                temp[k] = data
            }
            res = append(res, temp...)
        }
    } else {
        beego.Debug(err)
    }
    return res
}

func ReadXlsx(excelFileName string) (res [][]string) {
    xlFile, err := xlsx.OpenFile(excelFileName)
    if err == nil {
        beego.Debug(excelFileName, " file data read...................")
        for _, sheet := range xlFile.Sheets {
            temp := make([][]string, len(sheet.Rows))
            for k, row := range sheet.Rows {
                var data []string
                for _, cell := range row.Cells {
                    data = append(data, cell.Value)
                }
                temp[k] = data
            }
            res = append(res, temp...)
        }
    } else {
        beego.Debug(err)
    }
    return res
}

golang csv,xls,xlsx的更多相关文章

  1. Android 导入导出CSV,xls文件 .

    1 . http://www.bangchui.org/read.php?tid=62 2 .http://blog.csdn.net/xinzheng_wang/article/details/77 ...

  2. 用NPOI实现导入导出csv、xls、xlsx数据功能

    用NPOI实现导入导出csv.xls.xlsx数据功能   直接上代码 首先定义一个接口   如果需要直接操作文件的话,就自己在封装一次 然后定义csv类的具体实现 这个需要引入命名空间LumenWo ...

  3. java读取excel文件(.xls,xlsx,csv)

    前提,maven工程通过poi读写excel文件,需要在pom.xml中配置依赖关系: 在<dependencies>中添加如下代码 <dependency> <grou ...

  4. phpexcel读取excel的xls xlsx csv格式

    我之前写过一篇PHP读取csv文件的内容 上代码index.php <?php /** * * @author XC * */ class Excel { public $currentShee ...

  5. 在Linux中CSV转换成XLSX

    在linux中,把csv文件转换成excel表格(xlsx或者xls) $ echo -e 'surname,name,age\nCarlo,Smith,23\nJohn,Doe,46\nJane,D ...

  6. 在.xls;*.xlsx类型文件的导入(可以导入多条数据)

    2018-11-28   17:36:35 需要jar包:poi-3.8-201203026.jar jsp页面: <LINK href="${basePath}plugins/upl ...

  7. POI读取excel工具类(xls,xlsx通用)

    package com.boot.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...

  8. py3 读入和写入csv,txt文件

    import numpy as npimport pandas as pdimport time import datetimeimport csv http://pandas.pydata.org/ ...

  9. POI解析excel格式的文件(xls,xlsx)

    先贴出所需的jar包: 1.poi-3.17-beta1.jar 2.poi-ooxml-3.17-beta1.jar 3.poi-ooxml-schemas-3.17-beta1.jar 4.com ...

随机推荐

  1. JavaScript DOM 编程艺术(第2版)读书笔记(1)

    JavaScript 简史 JavaScript 是Netscape公司与Sun公司合作开发的.在 JavaScript 1.0发布时,Netscape Navigator主宰着浏览器市场.微软在推出 ...

  2. Human Gene Functions

    Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18053 Accepted: 1004 ...

  3. nylg 640 Geometric Sum

    Geometric Sum 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 Compute (a + a^2 + … + a^n) mod m.(a+a2+…an)m ...

  4. Swift 动画学习笔记

    视频地址: http://www.swiftv.cn/course/i275v5lz 1,动画属性 position(位置),opacity(透明度,0 全透明,1 不透明),Scale(尺寸),Co ...

  5. js友好提示是否继续,post提交

    <script type="text/javascript"> function delcheck(qId,typeid) { if (!confirm('确定删除吗? ...

  6. (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。

    package a; public class Jidongche { private String chepaihao; private int chesu; private double zaiz ...

  7. C++,利用链式栈实现括号匹配,界面友好,操作方便,运行流畅

    #include<iostream> #include<string> using namespace std; struct Node { char ch; Node* ne ...

  8. Debug不崩溃Release版本崩溃的一种原因

    今天有一个工程Debug是正常,Release崩溃,郁闷至极. 研究了一下下午,原因是一个类成员变量没有构造函数中初始化.而Debug版本正好没有问题. 所以定义类成员,一定不能忘记初始化!!

  9. MySql性能优化相关

    原来使用MySql处理的数据量比较少,小打小闹的,没有关注过性能的问题.最近要处理的数据量飙升,每天至少20W行的新增数据,导致MySql在性能方面已经是差到不可用的地步了,必须要重视MySql的优化 ...

  10. MSChart使用

    制作报表的时候结果出现画红线处的信息太散, 如果没必要全部显示出来,我们可以使用这种效果: 注意和前面的区分,这个功能叫做Collect Pie Slices(收集分区) 要实现此功能,应先了解相关信 ...