Golang为别人写的csv文件处理的例子
时间:2022-05-05
本文章向大家介绍Golang为别人写的csv文件处理的例子,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package main
import (
"encoding/csv"
"flag"
"io"
"log"
"os"
"sort"
"strings"
)
var quick, first, unrepeat bool
func main() {
path := flag.String("p", "", "-p 指定csv文件路径")
logname := flag.String("l", "", "-l 指定结果输出路径,不指定则输出到标准输出")
flag.BoolVar(&quick, "q", false, "-q 数据全部加载到内存中处理,默认是少量数据加载到内存操作,bool值")
flag.BoolVar(&first, "f", false, "-f 使用首次遇到的一条数据,默认是使用最后遇到的一条数据,bool值")
flag.BoolVar(&unrepeat, "u", false, "-u 默认是使用重复数据,bool值")
flag.Parse()
if *logname != "" {
File, err := os.Create(*logname)
if err != nil {
log.Println("创建输出文件失败:", err.Error())
return
}
log.SetOutput(File)
}
if *path == "" {
flag.Usage()
return
}
Read(*path)
}
func Read(path string) {
File, err := os.Open(path)
if err != nil {
log.Println("读取csv文件失败,错误信息:", err.Error())
return
}
defer File.Close()
csvr := csv.NewReader(File)
if quick {
QMerge(csvr)
} else {
list := SMerge(csvr, File)
FromLineRead(list, path)
}
}
func QMerge(r *csv.Reader) {
var m = make(map[string][]string)
var list []string
var repeat []string
r.Read()
var err error
var key string
for {
list, err = r.Read()
if err != nil {
if err != io.EOF {
log.Println("读取文件内容失败,错误信息:", err.Error())
}
break
}
if len(list) != 5 {
log.Println("无效数据:", list)
continue
}
key = strings.TrimSpace(list[1] + list[3])
if key != "" {
if _, ok := m[key]; ok {
repeat = append(repeat, key)
if !first {
m[key] = list
}
} else {
m[key] = list
}
}
}
for _, value := range repeat {
if unrepeat {
delete(m, value)
} else {
log.Println(m[value])
}
}
if unrepeat {
for _, value := range m {
log.Println(value)
}
}
}
func SMerge(r *csv.Reader, seek io.Seeker) []int {
var m = make(map[string]int)
var list []string
var repeat []string
r.Read()
var key string
var err error
var line int
for {
list, err = r.Read()
if err != nil {
if err != io.EOF {
log.Println("读取文件内容失败,错误信息:", err.Error())
}
break
}
if len(list) != 5 {
log.Println("无效数据:", list)
line++
continue
}
key = strings.TrimSpace(list[1] + list[3])
if key != "" {
if _, ok := m[key]; ok {
repeat = append(repeat, key)
if !first {
m[key] = line
}
} else {
m[key] = line
}
}
line++
}
var lines = make([]int, 0, len(m))
for _, v := range repeat {
if unrepeat {
delete(m, v)
} else {
lines = append(lines, m[v])
}
}
if unrepeat {
for _, v := range m {
lines = append(lines, v)
}
}
sort.Ints(lines)
return lines
}
func FromLineRead(lines []int, path string) {
File, err := os.Open(path)
if err != nil {
log.Println("读取csv文件失败:", err.Error())
return
}
defer File.Close()
r := csv.NewReader(File)
r.Read()
var list []string
var line, index int
for {
list, err = r.Read()
if err != nil {
if err != io.EOF {
log.Println("读取文件内容失败,错误信息:", err.Error())
}
break
}
if lines[index] == line {
log.Println(list)
index++
if index >= len(lines) {
break
}
}
line++
}
}
- Leetcode-Easy21. Merge Two Sorted ListsDefinition for singly-linked list.class ListNode:def init(sel
- Burp Suite详细使用教程-Intruder模块详解
- 逆元的三种解法(附详细证明)
- JavaScript设计模式与开发实践 - 单例模式
- Leetcode-Easy 141. Linked List Cycle
- 【DataMagic】如何在万亿级别规模的数据量上使用Spark
- 51nod1004 n^n的末位数字
- Leetcode-Easy 20. Valid Parentheses
- Leetcode-Easy 234. Palindrome Linked List
- 为什么是link-visited-hover-active
- 51Nod 1051 最大子矩阵和
- Javascript之创建对象
- Leetcode-Easy 136. Single Number
- 2017.10.25水题大作战题解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- OpenWRT配置Apache Webdav By HKL,
- 我向面试官讲解了单例模式,他对我竖起了大拇指
- 47 张图带你 MySQL 进阶!!!
- 新特性解读 | InnoDB-Cluster 扫盲-日常运维
- Laravel 框架实现无限极分类
- 这样设置IDEA,让你爽到飞起!
- 这些年,我写过的BUG(一)
- Selenium处理下拉列表
- 掌握好这几个css属性,少写100行js代码
- 计算机基础知识总结与操作系统 PDF 下载
- Kafka工作流程及文件存储机制
- JS破解初探,折腾到头秃的美拍视频采集下载
- 去哪儿景点信息爬取并使用Django框架网页展示
- Kubernetes v1.15.3 升级到 v1.18.5 心得
- 结巴分词seo应用,Python jieba库基本用法及案例参考