当前位置: 首页 > news >正文

c语言写入csv 逗号字符串,[转]C语言处理CSV文件的方法,以及kdd cup的简单说明...

C语言处理CSV文件的方法

什么是CSV文件

CSV是 Comma-separated values

(逗号分隔值)的首字母缩写,它通常是以逗号且不仅限于逗号分隔各个值,我们都叫他CSV。看下面的例子:

China, Shanghai, Pudong,

Zhang San, 200000, 1234567

BMW; GER; 300000; RMB;

i530

从上面两个例子可以看出,可以用不同的分隔符来分隔数据;数据的类型可以不同;长度任意。

由多行这样的CSV组成的文件叫做CSV文件(逗号分隔值文件)。当然,他们必须用同样的分隔符,对应每一列的数据要有相同的含义,不然这个文件就是无意义的。CSV文件可以直接用Microsoft

Office中的Excel打开,这里不讨论Windows下的操作。

C语言编程处理CSV文件

通常CSV文件中包含大量有用信息,而且有时数据量庞大,一个数据文件会达到1G的大小,一般都是日志等重要信息。对CSV文件的处理也有很多方法,常见的就是用Bash,

Python, Perl

等脚本语言来处理。这里提供一种用C语言处理CSV文件的方法。以下过程都是在Linux环境下进行的,Windows用户请注意移植。

C语言标准库中有一个字符串(string.h)函数 strtok ,它的原型是

char *strtok( char *s,

const char *ct );

它以 ct 中的字符为分界符,将字符串 s 分成许多记号。第一次调用时,它搜索 s ,找到不包含ct的第一个记号,将 s

中的下一个字符替换为 ‘/0’ ,并返回指向记号的指针。随后调用 strtok 函数时(由 s 的值是否为NULL指示),返回下一个不包含 ct

中字符的记号。当 s 中没有这样的记号时,返回NULL 。每次调用时的 ct 可以不同。

注意红色标记的部分,这个函数的使用方法是(假设以逗号为分隔符):

char str[] = “Life is

like, a box of chocolate, you never, know what you’re, gonna

get”;

char delims[] = “,”;

char *result = NULL;

result = strtok( str, delims );

while( result != NULL ) {

printf( “%s /n”, result );

result = strtok( NULL, delims

);

}

OUTPUT:

life is like

a box of chocolate

you never

know what you’re

gonna get

这里只是单纯的把CSV分解成独立的可供后续处理的字符串,下面介绍一个复杂些的例子。

KDD CUP 99 DATASET

Preprocessing KDDCUP99数据集的预处理

关于KDD CUP 99数据集的介绍请看这里。

KDD CUP

99数据集是网络入侵检测(NIDS)的标准测试集,为IDS研究人员提供训练数据集和测试数据集,以期比较不同入侵检测方法的优劣。尽管该数据集是1998年建立的,但仍是现在研究最多的IDS数据集。

该数据集每一行就是由tcpdump采集并处理的一条记录,包含了41个特征值和1个攻击类型说明,每一个特征之间用逗号分隔,最后用逗号分隔攻击类型。训练集的一个1/10子集共有

494,021 条记录,是一个标准CSV文件。下面是其中3条记录:

0,icmp,ecr_i,SF,1032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,511,511,0.00,0.00,/

0.00,0.00,1.00,0.00,0.00,255,255,1.00,0.00,1.00,0.00,0.00,0.00,0.00,0.00,smurf

0,tcp,http,SF,287,41018,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,15,32,0.00,0.00,/

0.07,0.03,1.00,0.00,0.16,61,255,1.00,0.00,0.02,0.01,0.00,0.00,0.02,0.00,normal

0,icmp,eco_i,SF,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0.00,0.00,0.00,/

0.00,1.00,0.00,0.00,3,15,1.00,0.00,1.00,0.27,0.00,0.00,0.00,0.00,ipsweep

由于数据的类型比较复杂,有离散类型(比如协议类型tcp,

upd…)和连续类型(持续时间,发送包数量等),要分开处理。预处理过程分两步:1. 映射。将符号型的数据(symbolic-valued attribute)映射到数值型数据(numeric-valued

attribute)。2. 归一化。将所有数据都调整到 [0.0 , 1.0]区间内。

由于strtok只能处理字符串类型数据,需要用 atoi , atol, atof

字符串转换函数来将字符串转换为数字,方便归一化处理。

….

while ( fgets( line,

length, fp ) != NULL ) { //read

a single line of dataset

result = strtok(line,

“,”); //read

the first attribute

for ( i = 0; i < 42; i++ )

{

switch (i) { //mapping and scaling the 41 attributs + 1 class respectively

case

0: //duration, continuous, [0, 58329]

printf(“%.2f,”, float(atoi(result))/DURATION);

break;

case

1: //protocal_type, symbolic, 3

printf(“%.2f,”, protocal_type(result));

break;

} //switch end

} //for end

result = strtok(NULL,

“,”); //continue reading next attribute

} //while end

每次读入一行数据文件,用strtok分隔出每个特征,再用switch判断是哪一个特征,然后对相应特征进行归一化处理。

总结

C语言对处理这种纯粹文本的数据不太擅长,虽然运行速度没的说,但编起来确实比较麻烦。建议还是用脚本语言配合正则表达式来做这种数据处理。

我程序中使用switch来判断特征值类型,由于一共有41个特征,所以比较麻烦,如果有简单的匹配方法,敬请E-mail我。

参考文献

1. http://www.elook.org/programming/c/strtok.html

2. The C Programming Language. 2nd Edition by

K&R

3. KDDCUP99

http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html

相关文章:

  • c语言阅读程序求结果题型,阅卷教师面对面 C语言程序设计五种题型别马虎
  • C语言wait参数status,C语言-系统-wait()和waitpid()函数
  • claim用法c语言中,通过一个例子学习Kubernetes里的PersistentVolumeClaim的用法
  • ipv6报文封装linux,IPv6报文的路由头封装方法及装置与流程
  • android 7下载地址,Android7.0下载地址 安卓7.0系统手机下载安装教程
  • android 弹出菜单环形,谷歌新专利:安卓环形菜单 双指触屏效率高
  • android相机拍摄时动画完成效果,Android 仿微信图像拍摄和选择界面功能(代码分享)...
  • 安装android 模拟器 停止运行程序,才知道,原来修改程序后,不需要重新启动AVD模拟器就可以测试程序运行的!...
  • 修改sim卡号码 android,android 如何动态修改SIM卡应用名称 MT6572 MT6589
  • android studio sqliteopenhelper,android studio使用SQLiteOpenHelper()建立数据库的方法
  • 一加5android 系统耗电,一加5评测:可能是今年最好的Android旗舰
  • 在线html代码生成器,支持网页快速排版 CSS代码一键生成的在线设计工具
  • html文件如何放置web站点,如何使用Go Web服务器提供静态html文件?
  • asp.net mv4 controller 跳转 静态html,Asp.Net MVC系列--进阶篇之controller(1)
  • html星星连线特效代码,js实现飞入星星特效代码
  • JavaScript 如何正确处理 Unicode 编码问题!
  • Centos6.8 使用rpm安装mysql5.7
  • CSS 提示工具(Tooltip)
  • Django 博客开发教程 8 - 博客文章详情页
  • exports和module.exports
  • express如何解决request entity too large问题
  • Gradle 5.0 正式版发布
  • linux学习笔记
  • Linux中的硬链接与软链接
  • markdown编辑器简评
  • Odoo domain写法及运用
  • Python socket服务器端、客户端传送信息
  • Rancher如何对接Ceph-RBD块存储
  • tweak 支持第三方库
  • Vue.js-Day01
  • 从零开始的无人驾驶 1
  • 第十八天-企业应用架构模式-基本模式
  • 技术发展面试
  • 技术胖1-4季视频复习— (看视频笔记)
  • 深度解析利用ES6进行Promise封装总结
  • 数据科学 第 3 章 11 字符串处理
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 小试R空间处理新库sf
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 数论-逆元
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #预处理和函数的对比以及条件编译
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (11)MSP430F5529 定时器B
  • (13)Hive调优——动态分区导致的小文件问题
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十八)SpringBoot之发送QQ邮件
  • (转)JAVA中的堆栈
  • .md即markdown文件的基本常用编写语法
  • .NET MVC之AOP
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况