Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Mr K
    őstag

    Milyen megoldással lehetne egy külső program konzolba írt tartalmát parse-olni?

    Van egy linux-os programom, ami bizonyos szenzorok adatait az alábbihoz hasonló módon adja vissza a konzolba kiírva:

    ... (néhány sor sima text elötte)
    group1.data1.value1: 123456
    group1.data1.value2: valamiszoveg
    group1.data1.value3: 123.01
    group1.data2.value1: valamiszoveg
    group1.data2.value2: 123456
    group2.data1.value1: 123456
    group2.data1.value2: 123456
    group2.data2.value1: 123456
    group3.data1.value1: 123456
    ...

    A lényeg, hogy minden tag új sorban van, a variable neve pontokkal van, a value lehet string, int, float.

    Szeretném bizonyos időközönként (30 másodpercenként) lefuttatni ezt a külsős exe programot és a visszakapott értékeket db-ben tárolni.
    Mivel volna érdemes nekikezdeni?
    Az exe futtatásban, a visszakapott értékek parsolásában kellene segítség.
    Db kezelés nem gond.

    Az exe futtatása megoldható a Runtime.getRuntime().exec(...) hívással. Visszakapsz egy processz-t, aminek a lefutását waitFor()-ral megvárod. Itt van rá egy kis példa program, ami már demonstrálja azt is, hogy hogyan lehet az exe outputját (stdout) megszerezni. (Alternatíva, hogy az exe egy fájlba írja az outputját, amit futás után normál módon fájlként felolvasol.)

    A parsolásra régebben még azt mondtam volna, hogy kell írni egy parsert, de manapság ez nem divat... Ha tényleg ennyire rögzített a szerkezet, akkor a sorban szereplő négy komponens (csoport, adatnév, értéknév, érték) előbányászható egy reguláris kifejezéssel is, pl. ezzel:

    ^([^.]+)\.([^.]+)\.([^.]+): *(.*?) *$

    Az outputot soronként célszerű feldolgozni, az elején vagy ki kell hagyni fix számú sort, vagy egyszerűen ki kell hagyni azokat, amire nem illeszkedik a regex:
    Pattern pattern = Pattern.compile(<a fenti regex>);
    while (<van sor>) {
    Matcher m = pattern.matcher(<a sor tartalma>);
    if (m.find()) {
    String sensorGroup = m.group(1);
    // ...
    String sensorValue = m.group(4);
    // DB mentés
    }
    }

    Alternatív szervezés: linux-ban oldod meg, amit lehet. A java program nem hajt végre exec-et, helyette a standard input-ot olvassa, és dolgozza fel. Hívni meg valahogy így:

    >sensor.exe <opciók> | java -jar sensorprocessor.jar

    És az egészet lehet futtatni pl. cron-ból. (Hátránya, hogy a JVM indítás kissé erőforrásigényes, 30 másodpercenként meg pláne.)

    Megjegyzések: (1) fejből írtam, a kódot tekintsük pszeudokódnak, (2) a regex pattern-ben a \-eket duplikálni kell a Java string konstansban.

    Szerk: A korábbi válaszokat nem láttam, pár dolog így ismétlés, bocs.

  • bambano
    titán

    Milyen megoldással lehetne egy külső program konzolba írt tartalmát parse-olni?

    Van egy linux-os programom, ami bizonyos szenzorok adatait az alábbihoz hasonló módon adja vissza a konzolba kiírva:

    ... (néhány sor sima text elötte)
    group1.data1.value1: 123456
    group1.data1.value2: valamiszoveg
    group1.data1.value3: 123.01
    group1.data2.value1: valamiszoveg
    group1.data2.value2: 123456
    group2.data1.value1: 123456
    group2.data1.value2: 123456
    group2.data2.value1: 123456
    group3.data1.value1: 123456
    ...

    A lényeg, hogy minden tag új sorban van, a variable neve pontokkal van, a value lehet string, int, float.

    Szeretném bizonyos időközönként (30 másodpercenként) lefuttatni ezt a külsős exe programot és a visszakapott értékeket db-ben tárolni.
    Mivel volna érdemes nekikezdeni?
    Az exe futtatásban, a visszakapott értékek parsolásában kellene segítség.
    Db kezelés nem gond.

    A magam részéről mindenképpen szívlapáttal csapnám fejbe, aki erre a problémára java programot ír.
    bash shell + sed.

    szerk: letenni fájlba, linuxon, lyalylyly

  • Drizzt
    nagyúr

    Milyen megoldással lehetne egy külső program konzolba írt tartalmát parse-olni?

    Van egy linux-os programom, ami bizonyos szenzorok adatait az alábbihoz hasonló módon adja vissza a konzolba kiírva:

    ... (néhány sor sima text elötte)
    group1.data1.value1: 123456
    group1.data1.value2: valamiszoveg
    group1.data1.value3: 123.01
    group1.data2.value1: valamiszoveg
    group1.data2.value2: 123456
    group2.data1.value1: 123456
    group2.data1.value2: 123456
    group2.data2.value1: 123456
    group3.data1.value1: 123456
    ...

    A lényeg, hogy minden tag új sorban van, a variable neve pontokkal van, a value lehet string, int, float.

    Szeretném bizonyos időközönként (30 másodpercenként) lefuttatni ezt a külsős exe programot és a visszakapott értékeket db-ben tárolni.
    Mivel volna érdemes nekikezdeni?
    Az exe futtatásban, a visszakapott értékek parsolásában kellene segítség.
    Db kezelés nem gond.

    A Linuxos program időzített futtatására használj cront, vagy egyszerűen írj egy bash scriptet, ami tight loopban vár. A kimenetet meg simán irányítsd bele egy fájlba. A Java programban ugyanezt a fájlt nyisd meg ugyanilyen időközönként. Aztán dolgozd fel, s írd ki adatbázisba. Amúgy ahogy az adatod jellegét nézem, kb. egy time series database-ben lenne a legjobb őket tárolni. Erre jó pl. Influxdb. Aztán csinálhatsz rá mindenféle fancy ábrát Grafanával.

    Parse-olni ezt egyébként elég egyszerű, soronként végigolvasod, majd line.split("."), a három elemű tömböt meg felhasználod ahogy akarod..

    Más: Mi a legjobb, legmélyebb Spring video course amivel találkoztatok? Kéne nekem egy masszívabb. Ha csak fizetős van, az se gond. De örülnék, ha legalább 20 óra körüli lenne és nagyon a részletekbe menő.

Új hozzászólás Aktív témák