【问题标题】:How to convert a .txt file into .csv using AWK如何使用 AWK 将 .txt 文件转换为 .csv
【发布时间】:2020-04-06 13:47:12
【问题描述】:

我必须从将转换为 .txt 文件的网页收集数据。出于操作目的,必须使用 AWK 脚本将此 txt 转换为 csv。

txt 的结构如下:

    GME - Esiti dei mercati - MGP-GAS - asta (AGS) 
    Tabella esiti - MGP-GAS prezzi e volumi Esiti MGP-GAS ||

       |sessione del: 30/03/2020    |
    |
    |
    Prodotti |
    Prezzo |
    €/MWh |
    Volumi totali |
    MW |MWh |
    Acquisti SRG_TSO |
    MWh |
    Vendite SRG_TSO |
    MWh |

    MGP-2020-03-31 |8,625 |
    |4.027,000 |96.648,000 |
    |- |
    |96.648,000 |
    |

    |
    |
    |
    |
    Legenda 
    ||
    LEGENDA ||
    Prezzo  
    |Prezzo di remunerazione di cui all'Art. 103 della disciplina del Mercato del Gas naturale. 
    |
    Volumi (MW, MWh)  
    |Volumi accettati di cui all'Art. 103 della disciplina del Mercato del Gas naturale. 
    |
    Acquisti SRG_TSO  
    |Quantità accettate in acquisto da Snam Rete Gas. 
    |
    Vendite SRG_TSO  
    |Quantità accettate in vendita da Snam Rete Gas. 
    |
    |

我需要获取并导入 csv 的值是 MGP-2020-03-31 之后使用管道“|”的值作为分隔符。或更好: 编辑:

    MGP-2020-03-31 |8,625 |
    |4.027,000 |96.648,000 |
    |- |
    |96.648,000 |
    |

采用这种格式: 8,625|4.027,000|96.648,000|- |96.648,000

我没有使用 AWK 的经验,到目前为止我已经设法写了这个:

/Non ci sono dati/{
      exit
    }

    /sessione del/{
         data =  $3
    }

    /MGP/{
        data = data $0 

        print data
    }

    /Non ci sono dati/{
        print $0
    }

每当页面显示“Non ci sono dati”时,尝试捕捉“无数据”情况。如何获取第一行下方的值(值是 8,625 的值?)。你能帮忙吗? 谢谢

【问题讨论】:

  • 您想要获取的 MGP 数据是由什么划分的?显然它不是换行符,也不是竖线字符。
  • 您无法从 MGP 行获取第一个值,因为您立即调用 getline 来读取包含第一个值的行之后的行。 getline 很少是正确的方法,但如果您正在考虑使用它,请确保您了解 awk.freeshell.org/AllAboutGetline 讨论的所有内容。 edit您的问题是根据您提供的示例输入显示您期望的确切输出,

标签: csv awk export-to-csv


【解决方案1】:

以下是解决问题的方法(假设输入中的空行或仅带有 | 的行表示 MGP 部分的结尾):

$ cat tst.awk
sub(/^[[:space:]]*MGP[^|]+[|][[:space:]]*/,"") { inMgp=1 }
inMgp {
    sub(/[[:space:]]*[|][[:space:]]*$/,"")
    if ( NF ) {
        data = data $0
    }
    else {
        gsub(/[[:space:]]*[|][[:space:]]*/,"|",data)
        print data
        inMgp = 0
    }
}

$ awk -f tst.awk file
8,625|4.027,000|96.648,000|-|96.648,000

【讨论】:

  • 完美运行!我不会打扰您询问有关代码结构的问题,但我会尝试研究它,因为我对 AWK 真的一无所知。谢谢!
  • 听起来不错,不客气。在每个 sub() 之前和之后添加 some print` 语句,至少可以查看发生了什么,如果您有任何问题,请随时提出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多