【问题标题】:Convert numbers to scientific notation in csv format file将数字转换为 csv 格式文件中的科学计数法
【发布时间】:2018-12-12 12:02:24
【问题描述】:

我有一个 csv 文件,其标题包含每列的标题。我想将所有数字转换为只有 2 位小数的科学计数法格式。即 23452 应转换为 2.34e+04 和 0.00023452 应转换为 2.34e-04。

但是,我希望第一列保持不变。它的格式为 text_number ,例如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 

预期输出:

Name,ClassA,ClassB,ClassC
File_10,2.34e+03,2.12e-02,3.42e+01
File_50,4.3e+01,7.83e+03,2.4e-03
File_100,3e+02,2.4e-03,2.23e-5 

【问题讨论】:

  • 请添加 3-5 行示例文本并完成预期输出,这将有助于测试解决方案...另外,请添加您遇到问题的代码..
  • @Sundeep :我添加了一个小例子。我对脚本语言没有太多经验,所以我现在没有任何代码。对不起!!!
  • 抱歉,但您应该显示需要帮助的代码。标记 wiki(例如:stackoverflow.com/tags/awk/info)可以帮助您入门.. 也可以尝试在线搜索,例如:@ 987654322@
  • @Sundeep:肯定会通过 awk 文档来了解它在 csv 文件上的工作。谢谢。

标签: python bash awk sed


【解决方案1】:

给你。

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 可能会派上用场。

【讨论】:

  • 永远不要使用printf $X,始终使用printf "%s", $X,因为如果/当$X 包含printf 格式字符(如%s)时,前者将失败。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    记录分隔符RS 允许将每个数字作为一条记录捕获,因此避免使用任何循环。

    【讨论】:

    • 您可能希望将 sprintf("%1.2e",$i) 中的 $i 替换为 $1,尽管它的计算结果为 $0 并且仍然可以工作。 :D
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 2015-12-27
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多