我有一个 csv 文件,其中包含复数的数字表示形式。
-0.0272780+88932190i
0.2833029-10293882i
0.1990238+22901020i
0.3009823-22389991i
这是一个巨大的文件,我想将其转换为 C 头文件中的复数表示形式。
const Ipp32fc complexes[] = {
{-0.0272780,88932190 },
{ 0.2833029,10293882 },
{ 0.1990238,22901020 }
{ 0.3009823,22389991 },
... // you get the idea
在查找/替换中我尝试过
[\+-]$
或者
[\+-](+)$
用逗号替换内部符号然后我将执行一个简单的查找/替换i
并将其删除。
似乎无法获得正确的正则表达式。
答案1
awk
在命令行上使用:
$ awk 'BEGIN { print "const Ipp32fc complexes[] = {" } END { print "};" } { re=im=$0; sub("[+-][0-9.]*i$", "", re); sub("^-?[0-9.]*", "", im); sub("i$", "", im); printf "\t{ %s, %s },\n", re, im }' file
const Ipp32fc complexes[] = {
{ -0.0272780, +88932190 },
{ 0.2833029, -10293882 },
{ 0.1990238, +22901020 },
{ 0.3009823, -22389991 },
};
awk
添加了一些空格的命令:
awk '
BEGIN { print "const Ipp32fc complexes[] = {" }
END { print "};" }
{
re = im = $0
sub("[+-][0-9.]*i$", "", re)
sub("^-?[0-9.]*", "", im)
sub("i$", "", im)
printf "\t{ %s, %s },\n", re, im
}' file
BEGIN
这会在和块中打印出所需的 C 语言页眉和页脚文本END
,同时在较长的块中解析输入。
每行的输入都分配给re
和im
变量。变量re
获得虚部被截断后的所有内容,而im
变量获得实部并被i
删除。
假定数字仅包含数字和点。
然后打印数据。