总览

任何应用程序最重要的方面之一就是验证其输入。 如果输入不满足要求,最基本的方法就是失败。 但是,在许多情况下,这还不够。 在许多系统中,数据收集与数据分析是分开的。 它可能是调查或旧数据集。

在这些情况下,有必要在分析之前遍历整个数据集,检测无效或丢失的数据,修复可修复的内容,并标记或删除无法挽救的数据。 提供有关数据质量和遇到哪种错误的统计信息也很有用。

在这个由两部分组成的系列文章中,您将学习如何使用Go的文本工具,对CSV文件进行切片和切块,并确保数据一尘不染。 在第一部分中,我们将重点介绍Go语言中文本,字节,符文和字符串等文本处理的基础,以及使用CSV文件的基础。

Go中的文字

在深入研究数据清理之前,让我们从Go的文本基础开始。 构建块是字节,符文和字符串。 让我们看看每个人代表什么以及他们之间的关系。

字节数

字节是8位数字。 每个字节可以表示可能的256个值之一(2的8的幂)。 ASCII字符集中的每个字符都可以由一个字节表示。 但是字节不是字符。 原因是Go作为一种现代语言支持Unicode,其中有超过256个单独的字符。 输入符文。

符文

Go中的符文是int32类型的别称。 这意味着每个符文可以表示超过40亿个单独的值(2等于32的幂),足以覆盖整个Unicode字符集。

在以下代码中,您可以看到符文“ ∆”(在Mac上为alt-J)只是一个int32。 为了将它代表的字符打印到屏幕上,我必须将其转换为字符串。

package mainimport ("fmt"
)func main() {r := '∆'fmt.Println(r)fmt.Println(int32(r))fmt.Println(string(r))
}Output:8710
8710
∆

Unicode很复杂。 符文正式代表Unicode代码点。 Unicode字符通常由单个Unicode代码点表示,但有时不止一个。

弦乐

字符串正式是只读的字节片。 如果索引一个字符串,则返回一个字节:

func main() {s := "abc"for i := 0; i < len(s); i++ {fmt.Println(s[i])        }
}Output:97
98
99

字符串文字是用双引号括起来的一系列UTF-8字符。 它们可能包含转义序列,它们是反斜杠,后跟ASCII字符,例如\n (换行符)或\t (制表符)。 它们具有特殊的含义。 这是完整列表:

\a   U+0007 alert or bell
\b   U+0008 backspace
\f   U+000C form feed
\n   U+000A line feed or newline
\r   U+000D carriage return
\t   U+0009 horizontal tab
\v   U+000b vertical tab
\\   U+005c backslash
\'   U+0027 single quote  (valid only within rune literals)
\"   U+0022 double quote  (valid only within string literals)

有时,您可能希望直接将文字字节存储在字符串中,而与转义序列无关。 您可以避开每个反斜杠,但这很乏味。 更好的方法是使用反引号中包含的原始字符串。

这是一个带有\t (制表符)转义序列的字符串的示例,该字符串按原样表示一次,然后使用反斜杠转义,然后作为原始字符串表示:

func main() {s1 := "1\t2"s2 := "1\\t2"s3 := `1\t2`fmt.Println(s1)fmt.Println(s2)fmt.Println(s3)
}Output:1    2
1\t2
1\t2

尽管字符串是字节的切片,但是当您使用for-range语句遍历字符串时,每次迭代都会得到一个符文。 这意味着您可能会获得一个或多个字节。 使用for-range索引很容易看到这一点。 这是一个疯狂的例子。 希伯来语单词“שלום”的意思是“你好”(和和平)。 希伯来语也从右到左书写。 我将构造一个将希伯来语单词及其英语翻译混合在一起的字符串。

然后,我将按符文打印该符文,包括字符串中每个符文的字节索引。 如您所见,每个希伯来文符文占用两个字节,而英文字符则占用一个字节,因此即使该字符串有四个希伯来语字符,三个符号和五个英文字符(12个字符),该字符串的总长度为16个字节。 )。 此外,希伯来语字符将从右向左显示:

func main() {hello := "שלום = hello"fmt.Println("length:", len(hello))for i, r := range(hello) {fmt.Println(i, string(r))}
}Output:length: 16
0 ש
2 ל
4 ו
6 ם
8
9 =
10
11 h
12 e
13 l
14 l
15 o

当您有一个数据集要用怪异的引号和Unicode字符和符号混合进行清理时,所有这些细微差别都非常重要。

当打印字符串和字节片时,有几种格式说明符在两者上都相同。 %s格式按原样打印字节, %x每个字节打印两个小写十六进制字符, %X每个字节打印两个大写十六进制字符, %q打印使用go语法转义的双引号字符串。

要在格式字符串说明符中转义%符号,只需将其加倍即可。 要在使用%x%X时分隔字节,可以添加空格,如“%x”和“%X”。 这是演示:

func main() {s := "שלום"fmt.Printf("%%s format:  %s\n", s)fmt.Printf("%%x format:  %x\n", s)fmt.Printf("%%X format:  %X\n", s)fmt.Printf("%% x format:  % x\n", s)fmt.Printf("%% X format:  % X\n", s)fmt.Printf("%%q format:  %q\n", s)
}Output:%s format:  שלום
%x format:  d7a9d79cd795d79d
%X format:  D7A9D79CD795D79D
% x format:  d7 a9 d7 9c d7 95 d7 9d
% X format:  D7 A9 D7 9C D7 95 D7 9D
%q format:  "שלום"

读写CSV文件

数据可以多种方式到达。 CSV(逗号分隔值)是最常见的格式之一。 CSV数据非常有效。 文件通常在标题行中包含字段或数据列和数据行的名称,其中每一行包含每个字段的值,并用逗号分隔。

这是UFO目击数据集的一个小片段(确实)。 第一行(标题)包含列名,其他行包含数据。 您会发现“报告的颜色”列通常为空:

City,Colors Reported,Shape Reported,State,Time
Ithaca,,TRIANGLE,NY,6/1/1930 22:00
Willingboro,,OTHER,NJ,6/30/1930 20:00
Holyoke,,OVAL,CO,2/15/1931 14:00
Abilene,,DISK,KS,6/1/1931 13:00
New York Worlds Fair,,LIGHT,NY,4/18/1933 19:00
Valley City,,DISK,ND,9/15/1934 15:30
Crater Lake,,CIRCLE,CA,6/15/1935 0:00
Alma,,DISK,MI,7/15/1936 0:00
Eklutna,,CIGAR,AK,10/15/1936 17:00
Hubbard,,CYLINDER,OR,6/15/1937 0:00
Fontana,,LIGHT,CA,8/15/1937 21:00
Waterloo,,FIREBALL,AL,6/1/1939 20:00
Belton,RED,SPHERE,SC,6/30/1939 20:00

将这部分CSV数据写入文件需要进行一些字符串操作以及使用文件。 在深入探讨主要逻辑之前,这里有一些必不可少的部分:包定义,导入和数据字符串(请注意const的使用)。

package mainimport ("os""strings""bufio"
)data := `City,Colors Reported,Shape Reported,State,TimeIthaca,,TRIANGLE,NY,6/1/1930 22:00Willingboro,,OTHER,NJ,6/30/1930 20:00Holyoke,,OVAL,CO,2/15/1931 14:00Abilene,,DISK,KS,6/1/1931 13:00New York Worlds Fair,,LIGHT,NY,4/18/1933 19:00Valley City,,DISK,ND,9/15/1934 15:30Crater Lake,,CIRCLE,CA,6/15/1935 0:00Alma,,DISK,MI,7/15/1936 0:00Eklutna,,CIGAR,AK,10/15/1936 17:00Hubbard,,CYLINDER,OR,6/15/1937 0:00Fontana,,LIGHT,CA,8/15/1937 21:00Waterloo,,FIREBALL,AL,6/1/1939 20:00Belton,RED,SPHERE,SC,6/30/1939 20:00`

main()函数创建一个名为“ ufo-sightings.csv”的文件,检查是否没有错误,然后创建一个缓冲的编写器w 。 下一行的defer调用将缓冲区的内容刷新到文件中,该调用在函数末尾执行。 那就是延期的意思。 然后,它使用字符串包的Split()函数将数据字符串分成几行。

然后,在for循环内部,从每行修剪前导和尾随空白。 空行将被跳过,非空行将被写入缓冲区,后跟换行符。 而已。 最后,缓冲区将刷新到文件中。

func main() {f, err := os.Create("ufo-sightings.csv")if err != nil {panic(e)}w := bufio.NewWriter(f)defer w.Flush()lines := strings.Split(data, "\n")for _, line := range lines {line := strings.Trim(line, " ")if line == "" {continue}w.WriteString(line)w.WriteString("\n")}
}

从文件读取非常简单:

package main import (
"fmt"
"io/ioutil"
)func main() {data, err := ioutil.ReadFile("ufo-sightings.csv")if err != nil {panic(err)}fmt.Println(string(data))
}

结论

Go具有强大的功能来处理各种形状和编码的文本。 在本系列的这一部分中,我们研究了Go语言中的文本表示,使用字符串包进行文本处理以及处理CSV文件的基础知识。

在第二部分中,我们将把学到的知识付诸实践,以清理凌乱的数据,为分析做准备。

翻译自: https://code.tutsplus.com/tutorials/cleaning-up-your-data-with-go-part-1--cms-30298

使用Go清理数据:第1部分相关推荐

  1. 数据可视化 信息可视化_可视化数据以帮助清理数据

    数据可视化 信息可视化 The role of a data scientists involves retrieving hidden relationships between massive a ...

  2. 数据分析 数据清理_数据清理| 数据科学

    数据分析 数据清理 数据清理 (Data Cleaning) Data cleaning is the way toward altering information to guarantee tha ...

  3. unix和linux命令_Linux vs. Unix,在命令行中清理数据,为儿童准备的15本书,以及更多必读内容

    unix和linux命令 上周,关于Linux与Unix的一篇文章是最受欢迎的读物. 查看其他Opensource.com读者对以下内容的了解: Linux与Unix:有什么区别? ,作者:菲尔·埃斯 ...

  4. hbase表按rowkey和时间清理数据

    为什么80%的码农都做不了架构师?>>>    背景: 由于数据量非常大,客户需要对过期的数据进行清理,例如:hbase表中有2017年与2016年的数据,现在需要将2016的数据进 ...

  5. 华为mate30计算机删了怎么找回,华为Mate30怎么进行双清,清理数据缓存和恢复出厂设置的方法...

    也是来把咱们的这个华为Mate30手机的相关双清操作来分享一下了,双清就是包括清理数据和缓存了,也就是相当于给手机恢复出厂设置了,这个双清操作有时候也是用到的比较多的,所以也是有必要来解一下了,其实也 ...

  6. Docker 挂载数据卷、查看数据卷、清理数据卷

    Docker 挂载数据卷.查看数据卷.清理数据卷 创建容器并设置数据卷挂载 查看所有数据卷列表 查看`RabbitMQ`插件数据卷的具体信息 清除数据卷 创建容器并设置数据卷挂载 这里以允许Rabbi ...

  7. 清理数据 python_在python中使用熊猫清理数据

    清理数据 python In this post, we will be using the Pandas library with Python to demonstrate how to clea ...

  8. php数据清洗工具,phpcms一键清理数据还原方法

    phpcms一键清理数据还原方法 上周遇到了phpcms一键清理数据的问题,以下为还原办法: 1.用FTP登陆到[caches/bakup/default]文件夹,把这个文件夹整个复制下来. 2.把复 ...

  9. android 缓存数据大小设置在哪里,android-系统设置中的,清理数据和清理缓存

    点击"清除缓存" 会清除/data/data/packagename/cache目录下的内容 点击"清除数据" 会清除   除了/data/data/packa ...

  10. Excel清理数据的十大方法

    拼写错误的单词.难以去除的尾随空格.不需要的前缀.不正确的大小写和非打印字符给人一种不好的第一印象.导致数据混乱的因素还不止这些.请准备好.通过 Microsoft Excel 对工作表进行大扫除的时 ...

最新文章

  1. SLS:海量日志数据管理利器
  2. linux 手动释放内存
  3. 线程同步之——互斥量及死锁问题
  4. cs架构嵌入bs_车牌识别CS架构和BS架构详解
  5. 【Avalon】Avalon笔记(解析Dom模板树,按自己的规范)
  6. vim替换字符串带斜杠_Linux vi/vim最全使用指南
  7. php strtotime 8小时,php时间函数strtotime的深入理解
  8. vue和Java做数据交互_基于vue和springmvc前后端分离,json类接口调用介绍
  9. 开源软件的许可(License)
  10. 活动目录(LiveFolder)
  11. openstack nova ×××
  12. C语言汇编-函数调用堆栈的过程
  13. clover更新驱动 后不能开机_黑苹果安装教程 2020 台式机版(长期更新)
  14. 自动驾驶技术发展的5个阶段和现状
  15. mac触控板 鼠标中键_如何在Mac的触控板上添加中键
  16. mariaDB数据库安装
  17. 教程—— 微信公众号如何接入客服系统
  18. Ultra96安装指导和无线配置
  19. HTML 如何让图片自动改变大小,CSS如何设置图片的大小
  20. 彻底弄清补码加减法运算,正数、负数位移运算原理

热门文章

  1. 练习:定义一个方法用于判断一个字符串是否是对称的字符串,并在主方法中测试方法。 * 例如:“abcba“、“上海自来水来自海上“均为对称字符串。
  2. Java单例模式(Singleton)
  3. 个人博客系统整体介绍
  4. 联通鸿蒙卡怎么样,联通不限流量卡,联通无限流量,正规资费
  5. mysql查询字段最大的一条数据类型_SQL查询一个表中类别字段中Max()最大值对应的记录...
  6. 【NOIP模拟】项链
  7. ES — — elasticsearch初探
  8. IOS UI学习 UI 十个小控件 初度学习
  9. 软件测试周刊(第11期):飞狗
  10. 北京 Beijing