将数字转换为csv格式fi的科学记数法

2024-10-03 21:29:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,其中包含每个列的标题。我想把所有的数字转换成只有两位小数的科学记数格式。i、 e.23452应转换为2.34e+04,0.00023452应转换为2.34e-04。在

但是,我希望第一列保持不变。它采用文本编号的形式,例如ABC_100。我不想把ABC_100转换成ABC_1e+2。在

简单地说,离开第一列和第一行,我希望所有内容都改为2十进制科学格式。在

示例文件:

Name,ClassA,ClassB,ClassC
File_10,2342,0.0212,34.234
File_50,43.234,7834,0.0024
File_100,300,0.0024,2.2341e-5 

预期输出:

^{pr2}$

Tags: 文件csv文本标题示例内容格式数字
3条回答

另一个awk,基于@JamesBrown answer(用于检测数字),使用GNU awk,没有任何循环:

awk '
BEGIN{RS="[,\n]"}
$1+0==$1{$1=sprintf("%1.2e",$1)}
{printf "%s%s",$0,RT}' file

记录分隔符RS允许将每个数字捕捉为一条记录,从而避免使用任何循环。在

另一个在awk中:

$ awk '
BEGIN { FS=OFS="," }                # set field separators
{
    for(i=1;i<=NF;i++)              # iterate all fields
        if($i+0==$i)                # if $i is numeric
            $i=sprintf("%1.2e",$i)  # convert to scientific form
}
1' file                             # output
Name,ClassA,ClassB,ClassC
File_10,2.34e+03,2.12e-02,3.42e+01
File_50,4.32e+01,7.83e+03,2.40e-03
File_100,3.00e+02,2.40e-03,2.23e-05

给你。在

awk -F, 'NR == 1 {print}
  NR > 1 {
    printf $1;
    for (ii = 2; ii <= NF; ii++){
      printf(",%1.2e", $ii)
    }
    print ""}' input.txt

reference for printf可能会派上用场。在

相关问题 更多 >