Suchen und ersetzen in einer .csv

  • Stimmt, 15 und 16 sind noch leer...

    ich weiß nicht so genau, was ich anpassen soll :D Sorry

    ich hab es so ausgeführt wie du es geschickt hast, aber die Spalte 15&16 werden nicht gefüllt und die out wird bei jedem versuch größer, vermutlich werden die Datensätze angehangen anstatt die Datei zu überschreiben.

  • Habs angepasst...

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    $file=FileOpen("pricelist.csv",0)
    $zielDatei="out.txt"
    $fileD=FileOpen($zielDatei,BitOR(8,2))
    $arSWords=_gibSchluesselwoerterAlsArray("schlüsselwörter.txt")
    while 1
    $line=FileReadLine($file)
    if @error then
    ExitLoop
    endif
    $ar=StringSplit($line,";",2)
    ReDim $ar[Ubound($ar)>17?Ubound($ar):17]
    if UBound($ar)>16 then ;HIER ANPASSEN!!!!!! (nur exsistente Felder zählen)
    for $i=0 to UBound($arSWords)-1 step 1
    if $ar[9]=$arSWords[$i][0] then
    $ar[15]=$arSWords[$i][1]
    $ar[16]=$arSWords[$i][2]
    endif
    next
    endif
    $string=""
    for $l=0 to UBound($ar)-1 step 1
    $string&=$ar[$l]
    $tmp=3
    if $ar[15]<>"" or $ar[16]<>"" then
    $tmp=1
    endif
    if $l<UBound($ar)-$tmp then
    $string&=";"
    endif
    next
    FileWriteLine($fileD,$string)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;Falls deine Schlüsselworte in einer Datei stehen kannst das auch so machen:
    ;Aufbau der datei:
    ; J1;P1;Q1
    ; J2;P2;Q2
    Func _gibSchluesselwoerterAlsArray($file)
    $data=fileread($file)
    $ar=stringsplit($data,@crlf,2+1)
    local $array[UBound($ar)][3]
    for $i=0 to UBound($ar)-1 step 1
    if $ar[$i]<>"" then
    $tmp=StringSplit($ar[$i],";",2)
    $array[$i][0]=$tmp[0]
    $array[$i][1]=$tmp[1]
    $array[$i][2]=$tmp[2]
    endif
    next
    return $array
    EndFunc

    [/autoit]
  • Ok danke,

    jetzt habe ich noch das Problem, dass wenn in dem Schlüsselwort ein Leerzeichen enthalten ist, also z.B. "Software Lizenzen" dieser Datensatz einfach übersprungen wird. Kann man das noch irgend ändern?

  • ok, hier der code

    [autoit]

    #include <array.au3>
    $file=FileOpen("pricelist.csv",0)
    $zielDatei="out.txt"
    $fileD=FileOpen($zielDatei,BitOR(8,2))
    $arSWords=_gibSchluesselwoerterAlsArray("schlüsselwörter.txt")
    while 1
    $line=FileReadLine($file)
    if @error then
    ExitLoop
    endif
    $ar=StringSplit($line,";",2)
    ReDim $ar[Ubound($ar)>18?Ubound($ar):18]
    if UBound($ar)>17 then ;HIER ANPASSEN!!!!!! (nur exsistente Felder zählen)
    for $i=0 to UBound($arSWords)-1 step 1
    if $ar[9]=$arSWords[$i][0] then
    $ar[15]=$arSWords[$i][1]
    $ar[16]=$arSWords[$i][2]
    endif
    next
    endif
    $string=""
    for $l=0 to UBound($ar)-1 step 1
    $string&=$ar[$l]
    $tmp=4
    if $ar[15]<>"" or $ar[16]<>"" or $ar[17]<>"" then
    $tmp=1
    endif
    if $l<UBound($ar)-$tmp then
    $string&=";"
    endif
    next
    FileWriteLine($fileD,$string)
    WEnd
    ;Falls deine Schlüsselworte in einer Datei stehen kannst das auch so machen:
    ;Aufbau der datei:
    ; J1;P1;Q1
    ; J2;P2;Q2
    Func _gibSchluesselwoerterAlsArray($file)
    $data=fileread($file)
    $ar=stringsplit($data,@crlf,2+1)
    local $array[UBound($ar)][4]
    for $i=0 to UBound($ar)-1 step 1
    if $ar[$i]<>"" then
    $tmp=StringSplit($ar[$i],";",2)
    $array[$i][0]=$tmp[0]
    $array[$i][1]=$tmp[1]
    $array[$i][2]=$tmp[2]
    $array[$i][3]=$tmp[3]
    endif
    next
    return $array
    EndFunc

    [/autoit]

    bekomme das in der out ausgegeben, ich habe jetzt einfach mal vermutet, dass es am Leerzeichen liegt... Insgesamt sind es über 5k die übersprungen werden.

    Code
    "164266;0;EUR;4.19;""USB-Stick  4GB Silicon Power 720 Blue/Alu Case"";""Silicon Power"";SP004GBUF2720V1D;4712702625042;85235110;USB-Speicher;W;0.015;0.126;0.083;0.010;Speichermedien;USB-Stick;"
    "164265;21;EUR;21.60;""USB-Stick  64GB Silicon Power 320 White USB2"";""Silicon Power"";SP064GBUF2320V1W;4712702627800;85235110;USB-Speicher;B;0.013;0.126;0.084;0.010;Speichermedien;USB-Stick;"
    "81174;0;EUR;99999.99;""PC-Schrank DIGITUS 36HE 600x800mm, grau, mit Stahltür"";Digitus;""DN-19 36U-6/8-PC-SD"";4016032227205;94032080;""19"""" Gehäuse"";K;116.800;0.600;0.800;1.750"
    "163838;0;EUR;979.51;""HP Quadro K4200             (4GB,DDR5,active,DVI,2xDP)"";""Hewlett & Packard"";J3G89AA;;84715000;""Grafikkarten NVIDIA"";K;0.000;0.000;0.000;0.000"
    "47202;51;EUR;52.63;""KVM Switch LevelOne  4x USB KVM-0421 mit Audio"";""Level One"";KVM-0421;4015867137871;84719000;""KVM Switches"";B;1.832;0.200;0.370;0.085"
    "163987;0;EUR;462.15;""DDR4 32GB PC 3000 CL15 G.Skill KIT (8x4GB) 32GRBB Ripjaws 4"";G.Skill;F4-3000C15Q2-32GRBB;4719692001771;84733020;Speichermodule;K;0.000;0.000;0.000;0.000;PC-Komponenten;Arbeitsspeicher;"
    "37303;51;EUR;2.50;""Patchkabel equip RJ45 S/FTP Cat6  3.00m grün (SSTP) PIMF HF"";Equip;605542;4015867107348;85444210;""Cat6 Kabel"";B;0.117;0.200;0.330;0.400"
  • Habe es zwischen zeile 19+20 eingefügt, bekam aber dann ein Fehler in Zeile 20, habe es daraufhin zwischen Zeile 18+18 eingefügt und das Skript läuft durch, aber das Problem das die Werte nicht eingesetzt werden besteht immer noch.

    [autoit]

    #include <array.au3>
    $file=FileOpen("pricelist.csv",0)
    $zielDatei="out.txt"
    $fileD=FileOpen($zielDatei,BitOR(8,2))
    $arSWords=_gibSchluesselwoerterAlsArray("schlüsselwörter.txt")
    while 1
    $line=FileReadLine($file)
    if @error then
    ExitLoop
    endif
    $ar=StringSplit($line,";",2)
    ReDim $ar[Ubound($ar)>18?Ubound($ar):18]
    if UBound($ar)>17 then ;HIER ANPASSEN!!!!!! (nur exsistente Felder zählen)
    for $i=0 to UBound($arSWords)-1 step 1
    if $ar[9]=$arSWords[$i][0] then
    $ar[15]=$arSWords[$i][1]
    $ar[16]=$arSWords[$i][2]
    $ar[17]=$arSWords[$i][3]
    endif
    next
    endif
    $string=""
    for $l=0 to UBound($ar)-1 step 1
    $string&=$ar[$l]
    $tmp=4
    if $ar[15]<>"" or $ar[16]<>"" or $ar[17]<>"" then
    $tmp=1
    endif
    if $l<UBound($ar)-$tmp then
    $string&=";"
    endif
    next
    FileWriteLine($fileD,$string)
    WEnd
    ;Falls deine Schlüsselworte in einer Datei stehen kannst das auch so machen:
    ;Aufbau der datei:
    ; J1;P1;Q1
    ; J2;P2;Q2
    Func _gibSchluesselwoerterAlsArray($file)
    $data=fileread($file)
    $ar=stringsplit($data,@crlf,2+1)
    local $array[UBound($ar)][4]
    for $i=0 to UBound($ar)-1 step 1
    if $ar[$i]<>"" then
    $tmp=StringSplit($ar[$i],";",2)
    $array[$i][0]=$tmp[0]
    $array[$i][1]=$tmp[1]
    $array[$i][2]=$tmp[2]
    $array[$i][3]=$tmp[3]
    endif
    next
    return $array
    EndFunc

    [/autoit]
  • Also bei mir klappte es mit den werten und deinen daten... du könntest dir mal zwischen zeile 14 und 15 den vergleich ausgeben lassen. dann weißt du, was der überhaupt vergleicht, bzw. was der tut.
    msgbox(48,"",$ar[9]&"="&$arSWords[$i][0])
    (mit rechtsklick aufs tray-icon kannst du das programm beenden (damit du dir nicht alle x-tausend daten ansehen musst ;) danach musst du nur noch die aktuelle msgbox wegklicken.)

  • Mir ist aufgefallen, dass in der Schüsselwortdatei die Datensätze, die 3 Spalten haben hinter dem 3. Datensatz kein Simikolon hatten, hatte diese jetzt manuell hinzugefügt, aber jetzt kommt error line 49.

    Kann es sein das es damit zusammenhängt?

    [autoit]

    #include <array.au3>
    $file=FileOpen("pricelist.csv",0)
    $zielDatei="out.txt"
    $fileD=FileOpen($zielDatei,BitOR(8,2))
    $arSWords=_gibSchluesselwoerterAlsArray("schlüsselwörter.txt")
    while 1
    $line=FileReadLine($file)
    if @error then
    ExitLoop
    endif
    $ar=StringSplit($line,";",2)
    ReDim $ar[Ubound($ar)>18?Ubound($ar):18]
    if UBound($ar)>17 then ;HIER ANPASSEN!!!!!! (nur exsistente Felder zählen)
    for $i=0 to UBound($arSWords)-1 step 1
    if $ar[9]=$arSWords[$i][0] then
    $ar[15]=$arSWords[$i][1]
    $ar[16]=$arSWords[$i][2]
    $ar[17]=$arSWords[$i][3]
    endif
    next
    endif
    $string=""
    for $l=0 to UBound($ar)-1 step 1
    $string&=$ar[$l]
    $tmp=4
    if $ar[15]<>"" or $ar[16]<>"" or $ar[17]<>"" then
    $tmp=1
    endif
    if $l<UBound($ar)-$tmp then
    $string&=";"
    endif
    next
    FileWriteLine($fileD,$string)
    WEnd
    ;Falls deine Schlüsselworte in einer Datei stehen kannst das auch so machen:
    ;Aufbau der datei:
    ; J1;P1;Q1
    ; J2;P2;Q2
    Func _gibSchluesselwoerterAlsArray($file)
    $data=fileread($file)
    $ar=stringsplit($data,@crlf,2+1)
    local $array[UBound($ar)][4]
    for $i=0 to UBound($ar)-1 step 1
    if $ar[$i]<>"" then
    $tmp=StringSplit($ar[$i],";",2)
    $array[$i][0]=$tmp[0]
    $array[$i][1]=$tmp[1]
    $array[$i][2]=$tmp[2]
    $array[$i][3]=$tmp[3]
    endif
    next
    return $array
    EndFunc

    [/autoit]