csv文件的处理,真是嗯哼哼的感觉

#tech #java

周三又去了百度面试,又是悲剧的被虐了。被问到最后我都可以厚着脸皮说:不会。

出了大门,觉得通体发寒,真是冷啊,所以站在太阳下面晒了一会儿。之后才感到自己的饥饿。花了一个小时坐车赶回到信工所。开始着手忙着李老师布置的任务。

任务大致来说是这样的:处理一份包含了50w条左右的excel数据表。于是我打算转换成csv格式进行读取和输出(对啊,为啥当时只想着用csv格式呢?不知道xls格式的可不可以读取呢,要查一下)。处理结果是输出另一份数据表。如果简单的想做的话,感觉应该是把数据导入数据库,然后利用sql语句进行操作会比较轻松些。但是实际情况是我没有安装环境,而且对sql语句也不是那么熟悉。再考虑到当时李老师给的deadline是当天就要结果。所以决定直接利用Java对数据进行读写和逻辑比较操作。感觉就像是自己重写了一些sql逻辑一样……当时十分头疼。

对应这个特殊的数据表:

time A number B number tag

我先进行了一些预处理,去掉了time属性列,因为是无用的,然后主序按A号排序,次要排序就是B和tag了。因为一些保密原因又不好叙述这些属性的意思,反正自己说吧,尽量能让自己记住明白就好了。tag属性只有两个值。

处理规则即生成表的格式:

A number indegree outdegree indegreeSum outdegreeSum

【表示A号,入度,出度,入度总数,出度总数。(入度出度根据tag值进行区别)】

A number B number indegrees outdegrees

【A号,B号,A号与B号之间的入度,……出度】

由于A号和B号都有相同的数据条目,所以需要进行逐条比较,然后对上表的后四个字段进行自加来生成。

由于是个数据表,所以我考虑用二维数组来存储。但是问题来了。

String[][] Array = new String[][];

这条语句是错误的。因为java要求数组必须初始化?反正是不能如此定义声明。(倒是也没有深入查找,要查一下) 纠结了很久到底怎样声明一个动态的二维数组呢?(又不想指定数组大小为50w的规模大小,虽然确实那么大……)

通过查询,最后想的方法是,从csv文件中readline一行,然后利用split()返回一个String[]数组。将这个数组存入一个Arraylist中,那么不就是类似一个二维数组了吗。

然后在利用循环从Arraylist里读取数组,分别记为historycurrent。两者相互比较相应的数组信息,再进行判断自加情况。详细的代码可以看项目doCSV里的CallToCNode.java和CallToCRate.java。

之后又需要对原始表的time列进行记数生成。 规则:单位时间内的节点数。 大致的想法还是跟上面一样。所以不再赘述了。

整个项目在doCSV

以上。不过在写记数逻辑的时候真是头疼啊,尤其是第一个生成表,有四个记数要记录,考虑每种字段比较的情况很心累啊。尤其是第一次写好后,发现隔几个数据就会发现错误记录的时候,简直要疯了。要错都错啊,不要几个是对的然后突然蹦出来一个错误的,都不知道到底哪里出错了,(后来发现是在比较第三个字段的时候有四种情况,之前只是考虑了两种情况,所以有对有错)。还有问题就是最后的一个current记录没有生成,当时太着急,就自己看着表格手动生成了。后来想想其实在循环外记录下current就可以了。