Как преобразовать файл .txt в .csv, используя AWK - PullRequest
1 голос
/ 06 апреля 2020

Мне нужно собрать данные с веб-страницы, которая будет преобразована в файл .txt. В целях манипулирования этот txt должен быть преобразован в csv с использованием сценария AWK.

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: после МГП-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?). Можете ли вы помочь? Спасибо

1 Ответ

1 голос
/ 06 апреля 2020

Вот как можно подойти к вашей проблеме (и предполагая, что пустая строка или строка с просто | на входе обозначает конец секции 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
...