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

Converting .dat files (inconsistent spacings and delimiters) to .csv files

提问人:Thanh Nguyen 提问时间:10/5/2023 更新时间:10/5/2023 访问量:87

问:

我正在尝试从此链接读取计算机和互联网使用数据。2019 年和 2021 年的数据集以 .csv、.dta 和 .dat 的形式提供,非常方便。

但是,2019 年之前的数据集位于 .dat 文件中,并且具有非常不一致的间距和分隔符,因为我查看了 nov21pub.csv 文件中的一些列并将它们与 nov21pub.dat 文件中的列进行了比较。数据集在某些列中还具有负数、NaN 和不同的数字长度。

是否可以使用 Python 或任何其他软件将 .dat 文件转换为 .csv 文件?

Python 字符串 数据帧 CSV 文件

评论

1赞 Michael Ruth 10/5/2023
是的,这是可能的。欢迎来到 Stack Overflow!请观看导览,阅读如何提问,尝试转换文件,并使用特定问题和最小可重现示例更新您的问题。这将大大提高答案的质量。
0赞 Michael Ruth 10/5/2023
将 nov17rep.dat 读入 s 的 a 后,并将其转换为可以传递给 的格式。liststrstr.strip()str.split()csv.writer
0赞 tripleee 10/5/2023
.dat是一个通用扩展名,仅表明文件包含“数据”。您是否有关于文件应包含的内容或文件结构的文档?

答:

0赞 chrslg 10/5/2023 #1

这是一种固定大小的格式。每个字段都有固定的字节数。

例如,在这里,第一个字段的大小为 5,第二个字段的大小为 2,第三个字段的大小为 10,...

当一个值填满它的所有大小时,它可能看起来被融化了,但这并不重要,因为格式并不模棱两可。

例如,对于大小为 5、2、10 的尺寸(为了简单起见,我跳过了其余的),您可以有线条

    4 2 123456789
12345 9   1234567
1234512    123456
12345121234567890

所以你可能会觉得第一行有 3 个数字,第三行有 2 个数字,最后一行有 1 个大数字。但事实并非如此。第一行是4,2,123456789;第二行是12345,9,1234567;第三个是 12345,12,123456(第一个字节 5 个是第一个数字,第二个字节旁边是 2 个);第 4 行包含 12345,12,1234567890

这就是您的文件中发生的情况。尤其是第 2 个字段(仅适合 2 位数字)。大多数情况下,它是 1 位数字。但在某些行中,它是 10、11、12,所以是 2 位数字。

该文件甚至是一个“简单”的文件,因为除了那些不时的 field1/2 融合之外,所有其他字段都可以用空格分隔(为什么我在引号之间加上“简单”。实际上,这恰恰相反更难,因为它使人们更难理解它不仅仅是用空格分隔的数字,因为几乎对于线条来说,它就是 tho。它以固定大小编号,并用空格填充)。

至于语用问题(如何阅读):有一个领域。如果该分隔符是字符串,则它是分隔字段的内容。如果它是一个整数数组,那么它就是字段大小的列表。 在您的文件中,每行显然有 163 个字段。1,5 个字节,第二个,2 个字节,然后是 161 个,每个 10 字节。np.genfromtxtdelimiter

所以应该是一个数组。你可以用这种方式构建delimiter[5,2,10,10,10,10...,10][5,2]+[10]*161

因此,答案是

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