Datum aus String entfernen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von φConst.

    Datum aus String entfernen

    Moin Leute,

    folgendes Problem,

    ich habe knapp 3.600 Dokumente, die ein Datum enthalten.
    Mal so: Datei_42_02_2014
    oder so: Datei32_2012.03
    oder so : File23_03.16

    Wie kriege ich diesen Rotz aus den Dateinamen entfernt? :/ Regex könnte mir ja helfen aber kriege die Syntax null hin.

    Bitte helft mir
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Um was für ein Dokument handelt es sich den?
    Sofern Regex zu kompliziert ist, gibt es auch noch andere Möglichkeiten, in dem der entsprechende Text gesucht und nachher entfernt wird.

    Aber vorher ist es schon wichtig, um was für ein Dokument es sich handelt, und mit welcher Grössenordnung darf man rechnen? (Also Dokument bzw. Stringlänge)

    Ach so jetzt seh ich gerade es handelt sich um den Dateinamen, also nur String. Es sind also kurze Strings.
    Stichwort INDEXOF INSERT


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Moin, Problem ist, dass diese 3.600 Dateien alle möglichen Daten in 4-5 verschiedenen Versionen beinhalten.
    Schreibei ch dafür eine Suche ersetze Datei, ist das viel zu groß.
    Die Dateinamen sind teilweise 40 Zeichen lang.
    Irgendwo im Dateinamen steckt dann eine dieser Zeichenfolgen
    _MM.YYYY_
    _MM.YY_
    .YYYY_MM.
    _YY.MM_

    usw. Dabei ist jeder Monat und jedes Jahr vertreten. Daher brauche ich eher sowas wie Regex um das Format zu prüfen.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Ja ein bisschen umstänbdlich ist dieser Weg schon, aber er funktioniert :thumbsup:

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Module Module1
    4. Public Sub Main()
    5. Dim len As Int32 = 15, splitter() As String
    6. Dim idx As Int32, tl As Int32, t As String
    7. Dim searchtext() As String = {"Datei", "File"}
    8. Dim filestr() As String = {"asdjhajsdhoweDatei_42_02_2014_sdljaslkalsdlaksjdad", _
    9. "ddghrtertgDatei32_2012.03_trgrtzrtre", _
    10. "ertzrzfdgsfgFile23_03.16_asasffrre", _
    11. "wefsdsfasdfFile87.03.16.jiocidnmasnfa"}
    12. For i As Int32 = 0 To filestr.Length - 1
    13. For Each st As String In searchtext
    14. idx = filestr(i).IndexOf(st)
    15. If filestr(i).IndexOf(st) >= 0 Then
    16. tl = st.Length
    17. t = filestr(i).Substring(idx + tl, len)
    18. splitter = t.Split({"."c, "_"c}, StringSplitOptions.RemoveEmptyEntries)
    19. t = String.Empty
    20. For Each sp As String In splitter
    21. If Not IsNumeric(sp) Then t &= sp
    22. Next
    23. 's = s.Remove(idx + tl, len).Insert(idx + tl, t)
    24. 'Sofern Datei und File auch weg müssen
    25. filestr(i) = filestr(i).Remove(idx, len + tl).Insert(idx, t)
    26. End If
    27. Next
    28. Next
    29. Stop
    30. End Sub
    31. End Module


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Ich hätt erwähnen sollen, dass die Dateinamen Produktnamen enthalten. Ein Dateiname kann so aussiehen : 647548_Türverkleidungselement_ZK_40-BR30.04_2016_Version_1.


    Die Sonderzeichen darf ich nur in Kombination mit 2-4 Stellingen Numeric Stirngs verwenden.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @razzzer530i

    Dann musst es wohl ein klein bisschen anpassen.
    Dafür brauchst du für Zeile 14 einen SuchBegriff, dass ist zwingend. Ohne den weiss das Programm nicht, wo ansetzen. ich denke das würde auch mit Regex eine Herausforderung werden.

    Freundliche Grüsse

    exc-jdbi

    razzzer530i schrieb:

    Ich hätt erwähnen sollen ...
    Ist gesichert, dass das Datum exakt dieses Format hat?
    Könnte es auch anders formatiert sein?
    Wenn Du das Datum hast, suche das nächste Leerzeichen davor und danach und lösch den Text dazwischen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @petaod
    Etwas weiter oben steht, das Monat und Jahr im Dateinamen ist. Die Tage werden also nicht drin sein. Im Beispiel wäre das also der Februar 2014.

    Wo ich halt das Problem sehe:
    Als Beispiel wurde 647548_Türverkleidungselement_ZK_40-BR30.04_2016_Version_1 genannt.
    Theoretisch kann das Monat 4 im Jahr 1930 (oder 2030) sein (30.04) oder Monat 4 im Jahr 2016. Hier kann man das Jahr 30 vielleicht ausschließen, würde da aber z.B. BR16.04_2016 stehen wäre nicht eindeutig klar, was davon das Jahr darstellt.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „AndPod“ ()

    imo sollte der TE einen Haufen BeispielDateinamen hochladen, der alle möglichen Vorkommnisse abdeckt - etwa in einer txt-Datei.
    Dann kann man ihm einen Regex dafür basteln.
    Und ich glaube nicht, dass man bei der Lösung des Problems um Regex herumkommt.
    Ich jdfs. hatte mal was ähnliches am Hacken: Log-Einträge mit Datumsen in wirklich allen möglichen denkbaren Formaten - grauenhaft! :cursing:

    Und - noch anzumerken: Regex ist (fast) immer nur eine "Heuristik" - also 99% der Fälle mögen abgedeckt sein, aber dann kommt doch noch iein findiger Erfinder, und (er)findet einen Fall, wo der Regex nicht das gewünschte Ergebnis bringt.
    Bevor das aus dem Ruder läuft, hier einmal die Liste der wichtigsten Dateien, in denen Das Datum auf jeden fall raus muss.


    Logisch wäre aus meiner Sicht einzig Regex, allerdings komme ich bei der Syntax einfach nicht mehr mit, wenn es so komplex wird.
    Dateien
    • docnames.txt

      (42,4 kB, 1.459 mal heruntergeladen, zuletzt: )
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „razzzer530i“ ()

    Eine Frage hätte ich noch. Ist es bei jedem Dateinamen wo ein Monat&Datum vorkommt so, das vor und nach der Kombination aus Monat und Jahr ein Sonderzeichen (_, -, usw) vorkommt?
    Wenn ich den ersten Dateinamen in deiner Liste nehme: 11049308_2014.07_EBA_XL_-_Tuerhalter_01.pdf
    So könnte es ja 08_2014 oder 2014.07 sein wenn meine Vermutung nicht stimmt.
    Ohne Datumsanzeige bleibt bestehen. Die Datumsanzeigen sollen aus den Namen komplett entfernt werden, sodass keine Datei mehr ein Datum enthält.

    Hintergrund:

    Die Dateien werden in einem Portal bereit gestellt.
    Die Datei heißt dieses Jahr Prospekt_alpha_01.2018 und nächstes Jahr Prospekt_alpha_03.2019

    Die Dokumente laufen durch einen Automatikmodus. Bei der Konstellation hätte ich somit plötzlich eine veraltete Datei und eine neue gleichzeitig im Portal.
    Aufgrund der selben Namen ohne Datumskennung(Die Namen der Dateien ändern sich nie, nur die Datumsangabe) werden die alten Dokumente dann überschrieben.
    Leider ist es nicht möglich, die Mitarbeiter dazu zu bewegen, alles einheitlich zu machen. Es sind knapp 350 Leute, die Dokumente bereitstellen können. -.-


    @AndPod In diesem Fall wäre das Datum 2014.07 und wurde hier vom Trenner _ vom eigentlichen Dateinamen differenziert. Jedoch wird auch teilweise das Datum durch einen Punkt vom Dateinamen getrennt. Z.B. Doc123_D13.11_18.... > Datum 11.2018 ... Aufgrund der vielen Leute einfach das absolute Chaos
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „razzzer530i“ ()

    @razzzer530i

    Hab mir das Problem jetzt genau 1/2 Std angeschaut, und bei bei ein wenig geprobt.
    Wenn du dich entschieden hast, auf Regex zu verzichten, können wir ja versuchen das gemeinsam mit den String-Funktionen zu lösen, ähnlich wie ich es oben gemacht habe.

    VB.NET-Quellcode

    1. 'Was soll hier gemacht werden
    2. '06-08-09-N80-Verbretterung.pdf
    3. 'H_16_S-1_Z-6.20-2025_A.PDF
    4. '249-Zertifikat4_Hoermann-Ichtershausen_42_2017-08-24.pdf


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Ein MUster, wassich zu erkennen vermeine ist, dass man ein Datum an einer 4er und 2er Ziffern-Gruppe erkennen kann (optional noch eine 2. 2er-Gruppe - der Tag).
    Mit einigen Dateien bin ich aber unsicher:

    Quellcode

    1. Zertifikat_ift_RollMatic_DE_EN_2013.pdf
    2. UEbereinstimmungszertifikat_H3_Nr._ZERT-3_1008-1_17.pdf
    3. 4432512393381-001_SupraMatic3_2012.pdf
    Sind da Datumse drin oder nicht?

    Nochn Problem:

    85306_EPL_Torabdichtungen_bis_2005_DE_01.pdf
    86736_EPL_LBmKlapplippe_2018_DE.pdf
    86737_EPL_LBmVorschub_2018_DE.pdf
    Zertifikat_ift_RollMatic_DE_EN_2013.pdf
    Zertifikat_EPU_40_TUEV_Nord_nach_TTZ_Richtlinie_Einbruchhemmung__gueltig_bis_19.11.17.pdf
    Zertifikat_EPU_42_TUEV_Nord_nach_TTZ_Richtlinie_Einbruchhemmung__gueltig_bis_18.12.2022__44_799_12745502.pdf
    Zertifikat_LPU_40_TUEV_Nord_nach_TTZ_Richtlinie_Einbruchhemmung__gueltig_bis_19.11.17.pdf
    Zertifikat_LPU_42_TUEV_Nord_nach_TTZ_Richtlinie_Einbruchhemmung__gueltig_bis_18.12.2022.pdf
    Zertifikat_LTE_42_TUEV_Nord_nach_TTZ_Richtlinie_Einbruchhemmung__gueltig_bis_18.12.2022_44_799_12745501.pdf
    Zertifikat_LTH_40_TUEV_Nord_nach_TTZ_Richtlinie_Einbruchhemmung__gueltig_bis_19.11.17.pdf
    Zertifikat_LTH_42_TUEV_Nord_nach_TTZ_Richtlinie_Einbruchhemmung__gueltig_bis_18.12.2022_44_799_12745504.pdf
    Kann es sein, dass das Dateien sind, deren Original-Name numal ein Datum enthält?

    Alternativ-Vorschlag:
    Wenn die bedatumten Dateien nur Versionen sind von Originalen, die dir vollständig vorliegen, dann könntest du auch annersrum vorgehen, und in deinem Bestand nach dem "Best-Match" suchen - also die Datei, die durch die wenigsten Zeichen-Zufügungen mit dem Kandidaten in Übereinstimmung gebracht werden kann.

    Oder überhaupt können die Kandidaten die Datum-Element-Prüfung überspringen, die genau namensgleich im Original-Bestand auffindbar sind.
    @exc-jdbi

    'Was soll hier gemacht werden
    '06-08-09-N80-Verbretterung.pdf
    'H_16_S-1_Z-6.20-2025_A.PDF
    '249-Zertifikat4_Hoermann-Ichtershausen_42_2017-08-24.pdf

    06-08-09 muss entfernt werden, 2. Datei beinhaltet keine richtiges Datumsformat 3. 2017-08-24 muss entfernt werden.

    Welchen Lösungsweg ich gehe, ist mir eigentlich egal, solange es sinnvoller ist als eine 5.000 Zeichen lange Suchen/Ersetze Datei zu schreiben. Mich reizt es, die Komplexität einer Funktion zu verstehen, die das Problem "locker flockig" löst.

    @ErfinderDesRades Völlig richtig. Diese gueltigkeitsDatei enthält ein Datum. Hier müsste aber zum beispiel __gueltig_bis_18.12.2022 aus dem Dateinamen entfernt werden. Für das gueltig_bis ein replace zu schreiben ist ja kein Thema, aber auch dahinter verbirgt sich dann wieder ein Datum.
    Alternativ-Vorschlag:
    Wenn die bedatumten Dateien nur Versionen sind von Originalen, die dir vollständig vorliegen, dann könntest du auch annersrum vorgehen, und in deinem Bestand nach dem "Best-Match" suchen - also die Datei, die durch die wenigsten Zeichen-Zufügungen mit dem Kandidaten in Übereinstimmung gebracht werden kann.

    Wäre generell eine Idee, funktioniert in Zusammenarbeit mit dem Portal nicht. Die Namen der Dateien sind dort fix gespeichert und sollten daher keine Daten enthalten. Wie ich auf Fileebene damit arbeite spielt keine Rolle, solange der Dateiname einer neuen Datei der alten Datei exakt entspricht.
    Notfalls müsste ich halt beim Upload alle alten Dokumente löschen und neu hochladen, was aber einen gigantischen Traffic bedeutet. Das würde ich gerne vermeiden
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @razzzer530i

    Also gibt es auch Datum-Formate, die nebst Jahr und Monat den Tag enthalten.

    Solchen Replace-Funktionen, egal ob man da mit Regex oder mit den Stringfunktionen arbeiten, verlangen immer einen gewissen Algorithmus. Ich selber würde da klar eine Definition setzen wollen.

    z.B.
    - Jeder String darf nur EINMAL vom Porgramm bearbeitet werden, sofern es was zum rauslöschen gibt.
    - Die Formate die in #3 definiert worden sind (_MM.YYYY_, _MM.YY_ etc.) müsste man nach Prioritäten behandelt können. D.h. Es spielt eine Rolle, welches Format zuerst geprüft wird also die Reihenfolge z.B. _MM.YYYY_, _MM.YY_ oder _MM.YY_, _MM.YYYY_
    und so weiter.

    Ich frage mich jetzt gerade, wie weit man bereit ist, am Schluss selber nochmals die Liste durchzuschauen, um solche Strings die nicht geändert wurden vom Programm, dann nachträglich selber zu bearbeiten.

    Freundliche Grüsse

    exc-jdbi
    @exc-jdbi

    Ein Beispiel:
    '249-Zertifikat4_Hoermann-Ichtershausen_42_2017-08-24.pdf'
    Hier ist der Tag (24) auch enthalten.
    Also müsste ich jedes mögliche Format prüfen. Nach der Prüfung könnte ich alle Files (Die befinden sich in verschiedenen Ordnern eines Verzeichnisses(Z.B. Stammverzeichnis SERVX\FILES...) final in einer txt listen und dann nochmal selbst prüfen. Der Upload wird aufgurnd der Datenmengen nur ein mal die Woche durchgeführt werden. Von daher sollte mich das nicht überfordern.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Wir haben solche Pattern:

    xx_yy_zzzz
    xx_yy.zzzz
    xxxx-yy-zz

    et cetera.

    Wir können dies formalisieren im Sinne von

    01_34.6789
    01 2 34 5 6789


    Jedes dieser Zahlen ist ein Index; von diesen Index-Pattern gibt es mehrere je nach Konstellation( das muss du dann eben manuell extrahieren).

    Eine Liste iteriert dann
    A) durch die File Names
    B) in derselben Schleife iterierst du durch die Index Pattern Liste . Wenn jedes der Chars die mit den Indizes korrespondieren Zahlen sind und die Lücken die entsprechenden Trennzeichen haben wir mit einer hohen Wahrscheinlichkeit Daten, dann können wir ganz bequem einfach die einzelnen Indizes nehmen um die jeweiligen Stellen mit $ ersetzen, wenn alles fertig ist wird jedes $ mit einem leeren string ersetzt ...

    Vielleicht programmiere ich _ noch was dazu .

    .. nur mal jetzt die Grundidee wollte ich darlegen.

    _
    Und Gott alleine weiß alles am allerbesten und besser.