Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Textdatei splitten in Anzahl Datensätze aus Originaldatei

Mitglied: lexura

lexura (Level 1) - Jetzt verbinden

13.02.2014, aktualisiert 14.02.2014, 2542 Aufrufe, 7 Kommentare, 3 Danke

Guten Tag an die Profis,

ich stehe vor einem Problem mit einer .txt Datei. Wir erstellen eine .txt datei mit Daten aus einem SQL-Server.
Jeder Datensatz belegt dabei eine feste Satzlänge (855 Zeichen) in der .txt Datei.
Die Daten in der .txt Datei werden fortlaufend geschrieben.

Es wird jeden Tag eine neue Datei mit unterschiedlicher Anzahl an Datensätzen erstellt.

Jetzt ist meine Aufgabe dazu, aus der EINEN .txt Datei für jeden darin enthaltenen Datensatz (je 855 Zeichen) eine eigene .txt Datei zu erstellen und diese dann in einem Unterverzeichnis zur Verfügung zu stellen. Quasi die Originaldatei zu splitten in die Anzahl der enthaltenen Datensätze.

Ein Programmcode in powershell oder vbs wäre für mich die Beste Wahl.

Kann jemand helfen ???

Besten Dank im voraus, Gruß lexura

Mitglied: bastla
LÖSUNG 13.02.2014, aktualisiert 14.02.2014
Hallo lexura und willkommen im Forum!

Da Du keine näheren Angaben zu den gewünschten Datei-/Verzeichnisnamen machst, verwende ich für die Ausgabe das Tagesdatum:
01.
Ein = "D:\Gesamtdatei.txt"
02.
Zeichenanzahl = 855
03.
Basisordner = "D:\" 'unter diesem Ordner wird der Unterordner erstellt
04.

05.
Set fso = CreateObject("Scripting.FileSystemObject")
06.

07.
Datum = Right(Date, 4) & "-" & Mid(Date, 4, 2) & "-" & Left(Date, 2) 'Datum in der Form "JJJJ-MM-TT"
08.
Pfad = fso.BuildPath(Basisordner, Datum) 'Ordnerpfad erstellen
09.

10.
T = fso.OpenTextFile(Ein).ReadAll 'Datei in String einlesen
11.
Anzahl = Int(Len(T) / Zeichenanzahl) 'Anzahl vollständiger Datensätze ermitteln
12.

13.
If Not fso.FolderExists(Pfad) Then fso.CreateFolder(Pfad) 'Ordner erzeugen
14.

15.
'Zählschleife für die formatierte Ausgabe der laufenden Nummer (4-stellig mit führenden Nullen)
16.
For i = 10001 To 10000 + Anzahl
17.
    'Datei mit dem Namen "JJJJ-MM-TT_####.txt" erzeugen
18.
    'Dateiinhalt: Teilstring ab Position (Abschnittsnummer - 1) * Zeichenanzahl mit Länge Zeichenanzahl
19.
    'Abschnittsnummer: i - 10000
20.
    fso.CreateTextFile(fso.BuildPath(Pfad, Datum & "_" & Right(i, 4)) & ".txt").Write Mid(T, (i - 10001) * Zeichenanzahl + 1, Zeichenanzahl)
21.
Next
Grüße
bastla
Bitte warten ..
Mitglied: colinardo
LÖSUNG 13.02.2014, aktualisiert 14.02.2014
Hi lexura,
und wenn du Powershell willst:
01.
$infile = "D:\data.txt" 
02.
$outpath = "D:\Ausgabeordner"
03.
$zeichen = 855
04.
$content = gc $infile | out-string
05.
$length = ($content | measure -Character).Characters
06.
$parts = 0
07.
if($length -gt $zeichen){
08.
  $parts = [int]($length/$zeichen)
09.
}else{
10.
  $parts = 1
11.
  $zeichen = $length
12.
}
13.
for($i=0;$i -lt $parts;$i++){
14.
  echo "$($content.Substring($i*$zeichen,$zeichen))" | out-file "$outpath\$(get-date -Format "yyyy-MM-dd")_$($i+1).txt"
15.
}
Die Ausgabe der Dateien erfolgt mit dem aktuellen Datum und einem Zähler für die Abschnitte: JJJJ-MM-TT_[Zähler].txt

Grüße Uwe
Bitte warten ..
Mitglied: lexura
14.02.2014, aktualisiert um 08:15 Uhr
Vielen vielen Dank !!! Die Scripte sind perfekt. Schön wenn Profis sich so unkompliziert bereit erklären zu helfen.

mit den freundlichsten und hochachtungsvollen Grüßen
Ralf
Bitte warten ..
Mitglied: lexura
14.02.2014 um 11:35 Uhr
Hallo nochmal,
nach den ersten Tests sind jetzt doch noch ein paar Hindernisse aufgetaucht. Das Ziel muss es sein Dateien zu haben die eine feste Satzlänge von 855 Zeichen haben, keinen BOM am Beginn der Datei und kein CRLF am Ende der Datei haben und die Dateien müssen im Format UTF-8 sein.

Ich habe mir das Powershellscript von Uwe als Basis genommen. Eine Kollegin probiert sich in VBS.

Das ich kein Programmierer bin, seht ihr wahrscheinlich gleich an meinem aktuellen Script. Wir hatten vorher schon die Ausgangsdatei vom BOM mit einem Powershell-Script bereinigt. Den Code habe ich mal einfach an das Script von Uwe angefügt. Das geht bestimmt auch eleganter, aber es funktioniert erstmal face-smile

Ich habe jetzt im Ausgangsordner ( ....\noBOM) alle Dateien ohne BOM und in UTF-8 liegen, leider noch inkl. CRLF am Ende.

Kann mir einer das Script vervollständigen, damit bei jeder Datei das CRLF am Ende entfernt wird, kein BOM am Beginn der Dateien steht, sie im UTF-8 Format sind und die Satzlänge genau 855 Zeichen beträgt ???

Hier mein vorläufiges angepasstes Script:

$date = Get-Date -Format "yyyy-MM-dd"
$infile = "D:\Ausgangsdatei.txt"
$outpath = "D:\Uebermittlungsdateien\"
$zeichen = 885
$content = gc $infile | out-string
$length = ($content | measure -Character).Characters
$parts = 0
if($length -gt $zeichen){
$parts = [int]($length/$zeichen)
}else{
$parts = 1
$zeichen = $length
}
for($i=0;$i -lt $parts;$i++){
echo "$($content.Substring($i*$zeichen,$zeichen))" | out-file "$outpath\$($date)_$($i+1).txt"
}

set-location "D:\Uebermittlungsdateien\"
foreach($i in ls -name *.txt)
{
$file = get-content $i
$encoding = New-Object System.Text.UTF8Encoding($False)
[System.IO.File]::WriteAllLines("D:\Uebermittlungsdateien_noBOM\" + $i, $file, $encoding)
}



Um CRLF am Ende einer Datei zu entfernen, haben wir bislang ein VBS benutzt. Dieses kann aber nur mit einer Datei klarkommen und nicht mit allen Dateien im Zielordner.

Hier mal der Ansatz in VBS: (hoffe das kann einer in Powershell nachstellen)


' File: crlf-entfernen.vbs

Option Explicit

Dim WSHShell, fso, FileIn, FileOut
Dim Datei, Text, Txt, i, arrSort, arrTest(), oArgs

Set WSHShell = WScript.CreateObject("WScript.Shell")
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
set oArgs = Wscript.Arguments

' Zuweisen von Admin-Rechten
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If WScript.Arguments.length =0 Then
Set objShell = CreateObject("Shell.Application")
'Pass a bogus argument with leading blank space, say [ uac]
objShell.ShellExecute "wscript.exe", Chr(34) & _
WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1
Else
'Add your code here
End If


' Fals ein Argument übergeben wurde, sollte es einen Dateinamen
' enthalten
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For i = 0 to oArgs.Count - 1 ' hole alle Argumente
Datei = oArgs.item(i)
If not fso.FileExists( Datei ) then
MsgBox UCase( Datei ) & " existiert nicht!" & vbCRLF & vbCRLF & " . . . das ist das Ende.", , WScript.ScriptName
WScript.Quit
End If
Exit For ' nur das erste Argument reicht
Next


' Gibt's keinen Dateinamen, wird halt das Skript gelesen
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if Datei = "" then Datei = WScript.ScriptName


' Datei komplett einlesen
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Set FileIn = FSO.OpenTextFile(Datei, 1 ) ' Datei zum Lesen öffnen

Text = FileIn.ReadAll

FileIn.Close
Set FileIn = nothing



' Inhalt bearbeiten
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Text = Replace( Text, vbCRLF , "" )
Text = Replace( Text, vbCRLF , "" )



' (Ziel-) Datei schreiben
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Datei = fso.GetBaseName( Datei ) & "-.txt"

Set FileOut = FSO.OpenTextFile( Datei , 2, true) ' Datei zum Screiben öffnen; 2: immer neu anlegen

FileOut.Write( Text )

FileOut.Close
Set FileOuT = nothing


Hoffe es euch genug erklärt zu haben. Evtl. hat ja jemand noch nen Lösungsansatz für mich.

Gruß Ralf
Bitte warten ..
Mitglied: colinardo
LÖSUNG 14.02.2014, aktualisiert um 12:13 Uhr
01.
$infile = "D:\Ausgangsdatei.txt"
02.
$outpath = "D:\Uebermittlungsdateien"
03.
$zeichen = 855
04.
$content = gc $infile | out-string
05.
$length = ($content | measure -Character).Characters
06.
$parts = 0
07.
if($length -gt $zeichen){
08.
  $parts = [int]($length/$zeichen)
09.
}else{
10.
  $parts = 1
11.
  $zeichen = $length
12.
}
13.
for($i=0;$i -lt $parts;$i++){
14.
  $file = $content.Substring($i*$zeichen,$zeichen).TrimEnd("`r`n")
15.
  [System.IO.File]::WriteAllText("$outpath\$(get-date -Format "yyyy-MM-dd")_$($i+1).txt",$file)
16.
}
Ansonsten poste doch mal einen Ausschnitt der Quelldatei (aber bitte mit CodeTags), oder schick so eine Datei mal via PM, damit wir hier nicht raten müssen...Danke.
Sind die Zeilenumbrüche zufällig die Trennung der Abschnitte?, dann könnte man das auch einfacher lösen ...
Grüße Uwe
Bitte warten ..
Mitglied: lexura
14.02.2014 um 12:11 Uhr
Yes, bislang sieht es SUPER aus. KNIEFALL !!!
Sollte bei weiteren Tests noch etwas auffallen, melde ich mich nochmals hier.

DANKE DANKE DANKE !!!
Bitte warten ..
Mitglied: lexura
17.02.2014 um 11:41 Uhr
Nochmals ein großen Dank an bastla und Uwe. Wir haben uns jetzt für die Powershell-Variante entschieden.
Seit heute läuft das fertige Script in unserer Produktionsumgebung einwandfrei.

Hier nochmals das finale Script:

$infile = "D:\Anwendungen\Eingang\Export.txt"
$outpath = "D:\Anwendungen\Ausgang\"
$zeichen = 885
$content = gc $infile | out-string
$length = ($content | measure -Character).Characters
$parts = 0
if($length -gt $zeichen){
$parts = [int]($length/$zeichen)
}else{
$parts = 1
$zeichen = $length
}
for($i=0;$i -lt $parts;$i++){
$file = $content.Substring($i*$zeichen,$zeichen).TrimEnd("`r`n")
[System.IO.File]::WriteAllText("$outpath\UTF-8_$(get-date -Format "yyyy-MM-dd")_$($i+1).txt",$file)
}
Bitte warten ..
Ähnliche Inhalte
Microsoft Office

Vorherigen Datensatz mit aktuellem Datensatz vergleichen

Frage von THEFRUSTMicrosoft Office1 Kommentar

Hallo, ich bin neu hier und hoffe auf Eure Hilfe zu einer Abfrage in ACCESS 2013. Zum oben genannten ...

Batch & Shell

Grep Textdatei nach mehreren Strings durchsuchen je String Anzahl der Zeilen ausgeben

gelöst Frage von cuilsterBatch & Shell8 Kommentare

Hallo lieber Foristen, Folgendes konnte ich bereits erfolgreich eruieren. Grep sucht in der Datei nach "ocsp" und spuckt mir ...

Batch & Shell

Batch - Ordnerstruktur bis bestimmte Anzahl von Unterverzeichnisse auslesen und in Textdatei schreiben

gelöst Frage von 115129Batch & Shell2 Kommentare

Hallo zusammen, da ich länger nicht mehr hier im Forum war ist es längst überfällig wieder einmal eine Frage ...

Microsoft Office

Serienbrief Nächster Datensatz Wenn

Frage von Druide83Microsoft Office2 Kommentare

Hallo, ist das erste mal dass ich mit Serienbriefen in Word zu tun habe und mir fehlt auch nur ...

Neue Wissensbeiträge
Datenschutz

SiSyPHuS Win10: Analyse der Telemetriekomponenten in Windows 10

Tipp von freesolo vor 21 StundenDatenschutz1 Kommentar

Alle die sich detailliert für die Datensammlung interessieren die unter Windows 10 stattfindet, sollten sich folgende Analyse des BSI ...

Sicherheit
Adminrechte dank Intel-Grafikkarte
Information von DerWoWusste vor 1 TagSicherheit1 Kommentar

ist das Advisory, welches beschreibt, welche Intel HD Graphics Modelle Sicherheitslücken haben, mit denen sich schwache Nutzer zu Admins ...

Internet

EU Urheberrechtsreform: Eingriff in die Internetkultur

Information von Frank vor 1 TagInternet1 Kommentar

Liebe Besucherin, lieber Besucher, warum erscheint das obere Banner in allen Beiträgen? Aus Protest gegen Teile der geplanten EU-Urheberrechtsreform ...

Windows Server
Windows Backup - FilterManager Event 3
Tipp von NixVerstehen vor 2 TagenWindows Server

Hallo zusammen, ich bin kein gelernter ITler und auch beruflich nicht in dem Feld tätig. Wir setzen in unserem ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Glasfaserkabel verlegen und Anschlüsse setzen
Frage von LLL0rdLAN, WAN, Wireless21 Kommentare

Hallo Leute, ich muss demnächst ein Netzwerkkabel auf einer Länge von ca. 70 Metern verlegen. Das Netzwerkkabel soll dabei ...

Windows Server
Mac Rechner im Windows Netzwerk - was jetzt?
gelöst Frage von Kopfg3ldWindows Server18 Kommentare

Hallo zusammen, ich habe folgende Herausforderungen. Aber erst mal was kurz zum Netzwerk - Windows Server (ältester ist ein ...

Microsoft Office
Sharepoint 2016 mag keine Umlaute in .docx-Titeln
gelöst Frage von DerWoWussteMicrosoft Office14 Kommentare

Moin Kollegen. Nutzt hier jemand Sharepoint? Könnt Ihr, unabhängig von der Sharepointversion, bitte einen Test machen? Ladet ein .docx ...

Basic
VBS soll alle Ordner auswählen, die im Startmenu angezeigt werden
Frage von Senseless-CreatureBasic12 Kommentare

Guten Morgen - gibt es eine Möglichkeit, per VBS das Startmenu in Win10 zu modifizieren? Ich beherrsche VBS mittlerweile ...