将.dat文件(不一致的间距和分隔符)转换为.csv文件

dwthyt8l  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(175)

我正在尝试从this link读取计算机和互联网使用数据。2019年和2021年的数据集以.csv、.dta和.dat的形式提供,非常方便。
然而,2019年之前的数据集在.dat文件中,并且在我查看nov21pub.csv文件中的一些列并将其与nov21pub.dat文件中的列进行比较时,间距和分隔符非常不一致。这些数据集在某些列中也有负数、NaN和不同的数字长度。
是否可以使用Python或任何其他软件将.dat文件转换为.csv文件?

swvgeqrz

swvgeqrz1#

这是一个固定大小的格式。每个字段都有固定的字节数。
这里,例如,第一字段具有大小5,第二字段具有大小2,第三字段具有大小10,.
当一个值填满了它的所有大小时,它可能看起来像是融化了,但这并不重要,因为格式并不模糊。
例如,对于那些尺寸为5、2、10(为了简单起见,我跳过了其余的部分)的文件,您可以使用行

4 2 123456789
12345 9   1234567
1234512    123456
12345121234567890

所以你可能会觉得第一行有3个数字,第三行有2个数字,最后一行有1个大数字。但事实并非如此。1号线是4,2,123456789;二线是12345,9,1234567;第三个是12345,12,123456(前5个字节是第一个数字,后2个字节是第二个数字);第4行包含12345,12,1234567890
这就是你档案里的内容。特别是第二个字段(仅适用于2位数)。大多数情况下,它是1位数。但在某些行中,它是10,11,12,所以是两位数。
这个文件甚至是一个“简单”的文件,因为除了那些字段1/2的融合,所有其他字段都可以用空格分隔(这就是为什么我把“简单”放在引号之间的原因)。事实上,这反而更难,因为它使人们更难理解它不仅仅是由空格分隔的数字,因为几乎所有的线都是这样。它以固定的大小编号,由空格填充)。
至于实用问题(如何阅读):np.genfromtxt有一个delimiter字段。如果这个字符串是一个字符串,那么它就是分隔字段的东西。如果它是一个整数数组,那么它是一个字段大小的列表。在您的文件中,每行显然有163个字段。1,5个字节,第2个,2个字节,然后161个,每个10个字节。
所以delimiter应该是一个数组[5,2,10,10,10,10...,10]。你可以这样构建[5,2]+[10]*161
所以答案

arr=np.genfromtxt('nov17rep.dat', delimiter=[5,2]+[10]*161, dtype=int)

相关问题