Daten aus verschiedenen Textdateien filtern und in eine Textdatei kopieren

T

thommy2204

Neues Mitglied
Thread Starter
Dabei seit
23.10.2015
Beiträge
5
Reaktionspunkte
0
Hallo zusammen.

Ich habe in einem Ordner eine große Anzahl (ca. 200) von Textdateien, deren Inhalt verschiedene Messwerte sind.
Ich möchte nun automatisiert eine Textdatei erstellen, wo von ALLEN Text-Dateien bestimmte Messwerte kommasepariert
(für den Import -> Excel) untereinanderstehen. Diese Messwerte lassen sich einfach über die SuFu in dem Text finden.

Beispiel:

Original - Textdatei: (nur ein Ausschnitt mit den relevanten Daten)

Dateiname: BAT275-1542-ok.txt

<Test Name="BAT275-1542">
<Description>4 Li-ion cells @ 60,0 Watts</Description>
<DateStarted>2015-10-12T13:57:38.3139093+02:00</DateStarted>
<BatteryType>LiIon</BatteryType>
<BatteryCapacity>107</BatteryCapacity>
<BatteryVoltage>14.4</BatteryVoltage>
<BatteryCells>4</BatteryCells>
<BatteryWeight>0.9</BatteryWeight>
<ChargerSerial>0</ChargerSerial>
<CellReaderSerial>0</CellReaderSerial>
<TestCutoffV>11.3</TestCutoffV>
<TestedCapacity>9.677411</TestedCapacity>
<TestTime>7888</TestTime>
<StopReason>LowVoltage</StopReason>
<Hide>false</Hide>
<LineColor>-65536</LineColor>
<LinePattern>Solid</LinePattern>
<PowerAmpType>NoAmp</PowerAmpType>


Ausgabe in die Textdatei "Export für Excel.txt" sollte dann so aussehen:

(die ersten 6 Stellen des Dateinamens), (die Stellen 8-11 des Dateinamens), 2015-10-12, 7888
nächste Zeile das gleiche der nächsten Datei usw...


für das Beispiel oben würde die Ausgabe dann so aussehen:

BAT275,1542,2015-10-12,7888
BAT276,1542,2015-08-15,7278
BAT277,1542,2015-09-28,7675
usw.



wer kann und will mir dabei helfen?

Ich habe es versucht mit dem Automator zu bewerkstelligen, bin aber völliger Neuling und hab es leider nicht geschafft...


vielen Dank für eure Hilfe
 
Ein kleines Shellscript mit ein wenig cut und grep sollte dafür reichen.
Ist das Datum immer fest die Stellen 14-23 der Zeile mit <DateStarted>?
Und genauso bei <TestTime>?
 
Hi roedert.

Ja, ganz genau. Die Stellen sind fest, daher dachte ich man sucht im Text dann nach "DateStarted" und "TestTime" und kopiert einfach die Stellen dahinter...

beste Grüße, Thommy.
 
Code:
exec > "Export für Excel.txt"
for file in *-*-ok.txt; do
  A=$(echo $file | cut -d- -f1)
  B=$(echo $file | cut -d- -f2)
  C=$(grep "^<DateStarted>" $file | cut -b14-23)
  D=$(grep "^<TestTime>" $file | cut -b11-14)
  echo $A,$B,$C,$D
done
 
jetzt die dämliche Frage für einen Neuling (sorry):

wie führe ich das nun aus?

im Terminal?
 
Ich habe es nun geschafft das script über das Terminal auszuführen, allerdings werden die Variablen C und D nicht gefüllt, weil wahrscheinlich
in der Zeile noch 6 Leerzeichen voranstellen, die man in dieser Forumsdarstellung nicht sieht; hab dann die Zahlen bei den cut-Befehlen jeweils um 6 erhöht,
jedoch ohne Erfolg.

Ich füge mal den Anfangsteil der Textdatei als code an.

Code:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<CBATest>
  <Version>2.4.7.0</Version>
  <Type>ConstantPower</Type>
  <ChartProperties>
    <Title>
    </Title>
    <ShowLegend>true</ShowLegend>
    <ShowGridLines>true</ShowGridLines>
    <ShowCutoffVoltage>true</ShowCutoffVoltage>
    <ChartGraphType>Minutes</ChartGraphType>
    <XAxisProperties>
      <Scrollbar>false</Scrollbar>
      <Range>false</Range>
      <Start>0</Start>
      <End>0</End>
    </XAxisProperties>
    <YAxisProperties>
      <Scrollbar>false</Scrollbar>
      <Range>false</Range>
      <Start>0</Start>
      <End>0</End>
    </YAxisProperties>
  </ChartProperties>
  <Tests>
    <Test Name="BAT296-1542">
      <Description>4 Li-ion cells @ 60,0 Watts</Description>
      <DateStarted>2015-10-16T09:45:02.9727456+02:00</DateStarted>
      <BatteryType>LiIon</BatteryType>
      <BatteryCapacity>107</BatteryCapacity>
      <BatteryVoltage>14.4</BatteryVoltage>
      <BatteryCells>4</BatteryCells>
      <BatteryWeight>0.9</BatteryWeight>
      <ChargerSerial>0</ChargerSerial>
      <CellReaderSerial>0</CellReaderSerial>
      <TestCutoffV>11.3</TestCutoffV>
      <TestedCapacity>9.054376</TestedCapacity>
      <TestTime>7244</TestTime>
      <StopReason>LowVoltage</StopReason>
      <Hide>false</Hide>
      <LineColor>-65536</LineColor>
      <LinePattern>Solid</LinePattern>
      <PowerAmpType>NoAmp</PowerAmpType>
      <StalledMilliseconds>0</StalledMilliseconds>
      <TestType Name="ConstantPower">
        <Power>60</Power>
        <Graph>Minutes</Graph>
      </TestType>
      <Notes />
      <Samples>
        <S T="0" V="16.691" C="0" Tp="999" />
        <S T="1" V="16.349" C="1.333" Tp="999" />
        <S T="2" V="15.867" C="2.54" Tp="999" />
        <S T="3" V="15.563" C="3.141" Tp="999" />
        <S T="4" V="15.341" C="3.467" Tp="999" />
        <S T="5" V="15.288" C="3.545" Tp="999" />
        <S T="6" V="15.237" C="3.693" Tp="999" />
        <S T="7" V="15.161" C="3.863" Tp="999" />
        <S T="8" V="15.123" C="3.925" Tp="999" />
        <S T="9" V="15.101" C="3.953" Tp="999" />
        <S T="10" V="15.089" C="3.966" Tp="999" />
        <S T="11" V="15.079" C="3.976" Tp="999" />
        <S T="12" V="15.071" C="3.975" Tp="999" />
        <S T="13" V="15.065" C="3.979" Tp="999" />
        <S T="14" V="15.063" C="3.979" Tp="999" />
        <S T="15" V="15.058" C="3.981" Tp="999" />
        <S T="16" V="15.053" C="3.98" Tp="999" />
        <S T="17" V="15.047" C="3.988" Tp="999" />
 
Wenn <DateStarted> nicht am Zeilenfang steht, muss beim grep das ^ davor weg!
also
C=$(grep "<DateStarted>" $file | cut -bxx-yy)

oder besser noch
C=$(grep "<DateStarted>" $file | cut -d">" -f2 | cut -b1-10)

Damit werden die Zeichen 1-10 nach dem ersten ">" zurückgeliefert.

Der saubere Weg wäre aber einen xml-Parser zu nutzen.
 
ok Danke.

xml-parser werde ich mal ergoogeln und ausprobieren.

Dir aber 1000 Dank für die Hilfe, du hast mich um Meilensteine vorwärts gebracht!!!

viele Grüße, THOMMY.
 
Zurück
Oben Unten