gpt4 book ai didi

bash - 如何使用 bash 命令将 csv 文件转换为二进制文件?

转载 作者:行者123 更新时间:2023-11-29 09:37:46 40 4
gpt4 key购买 nike

我有一个 csv 文件,它只是一个简单的以逗号分隔的数字列表。我想将此 csv 文件转换为二进制文件(只是一个字节序列,每个解释的数字都是 csv 文件中的数字)。

我这样做的原因是能够从数值电子表格中导入音频数据。在我的导入中(我正在使用 audacity),我有几种二进制文件格式可供选择:

Encoding:
Signed 8, 24, 16, or 32 bit PCM
Unsigned 8 bit PCM
32 bit or 64 bit float
U-Law
A-Law
GSM 6.10
12, 16, or 24 bit DWVW
VOX ADPCM

Byte Order:
No endianness
Big endian
Little endian

我一直在沿着 big endian 32-bit float 的路线移动,以保持简单。我想让事情尽可能简单,所以我认为 bash 是最佳工具。

最佳答案

I have a csv file which is just a simple comma-separated list of numbers. I want to convert this csv file into a binary file [...]

I was moving along the lines of big endian 32-bit float to keep things simple.

不确定如何在纯 bash 中做到这一点(实际上怀疑它是否可行,因为 float as binary 是非标准转换)。

但这里是一个简单的 Perl 单行代码:

$ cat example1.csv
1.0
2.1
3.2
4.3

$ cat example1.csv | perl -ne 'print pack("f>*", split(/\s*,\s*/))' > example1.bin

$ hexdump -C < example1.bin
00000000 3f 80 00 00 40 06 66 66 40 4c cc cd 40 89 99 9a |?...@.ff@L..@...|
00000010

它使用 Perl 的 pack functionf将 float 转换为二进制,<将它们转换为 BE。 (如果每个 CSV 行有多个数字,我还添加了拆分。)

附言将整数转换为具有原生字节序的 16 位短整型的命令:

perl -ne 'print pack("s*", split(/\s*,\s*/))'

使用 "s>*"对于 BE,或 "s<*"对于 LE,而不是 "s*" .

附言如果是音频数据,也可以查看sox工具。很久没用过了,但 IIRC 它可以将任何类似 PCM 的东西从几乎任何格式转换为任何格式,同时还应用效果。

关于bash - 如何使用 bash 命令将 csv 文件转换为二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37613688/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com