Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Steuerzeichen per vbs aus txt-Datei entfernen

Frage Entwicklung VB for Applications

Mitglied: eagle303

eagle303 (Level 1) - Jetzt verbinden

05.06.2007, aktualisiert 15.06.2007, 11030 Aufrufe, 13 Kommentare

Hallo zusammen,

ich hab folgendes Problem. Ich exportiere aus einer MS-SQL Datenbank mit bcp eine csv-Datei.
Diese bearbeite ich dann noch mit einem vbs-Script um Zeilenumbrüche zu entfernen. Danach
wird die Datei über sqlldr in eine Oracle Datenbank importiert (alles per Batch).
Das Problem ist, daß in der csv-Datei immer noch Steuerzeichen (NUL bzw. hex 00) vorhanden
sind, mit denen der SQL Loader nich klar kommt.
Damit bin ich auf der Suche nach einer Möglichkeit per Script (vbs) diese Steuerzeichen zu
entfernen.

Bin für jeden Tip dankbar.
Mitglied: bastla
05.06.2007 um 20:24 Uhr
Hallo Eagle303 und willkommen im Forum!

Als eigenständige Lösung für den beschriebenen Zweck könnte das so aussehen:
01.
strToRemove = Chr(0) 
02.
If WScript.Arguments.Count < 1 Then 
03.
	WScript.Echo "Bitte eine Textdatei als Argument übergeben!" 
04.
	WScript.Quit(1) 
05.
Else 
06.
strInFile = WScript.Arguments(0) 
07.
End If 
08.
Set fso = CreateObject("Scripting.FileSystemObject") 
09.
If Not fso.FileExists(strInFile) Then 
10.
	WScript.Echo "Die Datei " & strInFile & " wurde nicht gefunden!" 
11.
	WScript.Quit(1) 
12.
End If 
13.
Set objInFile = fso.GetFile(strInFile) 
14.
strOutFile = objInFile.Path 
15.
If fso.FileExists(objInFile.Name & ".bak") Then fso.DeleteFile(objInFile.Name & ".bak") 
16.
objInFile.Name = objInFile.Name & ".bak" 
17.
fso.OpenTextFile(strOutFile,2, True).Write Replace(fso.OpenTextFile(objInFile.Path, 1).ReadAll, strToRemove, "")
Aufruf von der Befehlszeile oder aus einer Batchdatei (Annahme: gespeichert unter "C:\Scripts\EntNullen.vbs"):
01.
cscript //nologo "C:\Scripts\EntNullen.vbs" "D:\NochMitNul.csv"
Die Ausgangsdatei bleibt als Sicherungskopie mit dem zusätzlichen Typ ".bak" erhalten.
Unter der Annahme, dass man/frau/kind derartiges vielleicht öfter brauchen könnte, habe ich gleich weiter ausgeholt - in Dein bestehendes Script könntest Du etwas in der Art einbauen:
01.
strNeueZeile = Replace(strAlteZeile, Chr(0), "")
Grüße
bastla

[Edit] Löschen einer bereits vorhandenen Sicherungskopie hinzugefügt. [/Edit]
Bitte warten ..
Mitglied: Biber
05.06.2007 um 20:46 Uhr
@bastla
Hmmmm, ...ausnahmsweise Veto.

Mit Deinem Schnipsel erfüllst Du natürlich vordergründig die Anforderung Eagle303s (willkommen auch von mir BTW), aber die exportierte/importierte DB hat sich verändert.

@eagle303
Wenn Du, welcher Not auch immer gehorchend, den Weg über eine -csv gehst, um die Tabelleninhalte von A nach B zu bringen, dann musst Du auch dafür sorgen, dass NULL-Werte als solche erkannt, interpretiert und auch als NULL-Werte in die Tabellen-Kopie geschrieben werden.

Dazu musst Du ggf. beim Export die Spalten, die NULLABLE sind, einer Spezialbehandlung unterziehen (z.B. "SELECT ... CASE Telefon IS NULL THEN '<NULL>' Else Telefon as Telefon..) und entsprechend beim Import auch wieder aus einem Platzhalter '<NULL>' einen NULL-Wert machen...
Und die Werte, die z.B. Hex-Werte inclusive x00 enthalten können, eben auch als Text formatiert rausschreiben und beim Import rück-übersetzen.

Oder aber, Du verzichtest auf die pure Text-Ex/Importiererei und benutzt einen Dump.
Oder... es gibt doch im Jahre 2007 keine 2 DBs mehr, die sich nicht über ungünstigstenfalls ODBC miteinander connecten können, oder doch?

Grüße
Biber
Bitte warten ..
Mitglied: bastla
05.06.2007 um 21:02 Uhr
@Biber
Wo Du Recht hast, hast Du Recht: NULL != ""

Aber wenn's nun schon mal ein VB-Script gibt:
01.
strNeueZeile = Replace(strAlteZeile, Chr(0), "<NULL>")
Grüße
bastla
Bitte warten ..
Mitglied: Biber
05.06.2007 um 21:18 Uhr
*lach*...

Sorry, bastla,
da hast Du nun wieder Recht (und ich das Brett vorm Kopf). *gg

Aber dann wird der Import auch nicht ganz ohne Logik gehen können, es sei denn, es wäre bekannt, welchen String denn der SQL-Loader seinerseits in einen NULL-Wert übersetzt.

Wie geschrieben, Dein Script-Ansatz erfüllt ja alles (-->das, was ich immer süffisant als "...works as designed... bezeichne).
Aber ...bei aller Genügsamkeit, die wir M$-Endkunden gelernt haben:
Etwas Moderneres als Export/Import per .csv-Datei ist doch schon erfunden, oder nicht?

Gruss
Biber
Bitte warten ..
Mitglied: bastla
05.06.2007 um 21:33 Uhr
@Biber
Etwas Moderneres als Export/Import per .csv-Datei ist doch schon erfunden, oder nicht?
Und dann ganz ohne Batch oder Script? *schnief*

Aber dann wird der Import auch nicht ganz ohne Logik gehen können ...
Ja nee, is klar, aber täte es nicht ein einfaches UPDATE?

Grüße
bastla
Bitte warten ..
Mitglied: Biber
05.06.2007 um 21:46 Uhr
@bastla

Klar, bastla, wenn die uns beide da ranlassen würden, dann würden wir die M$-SQL-Daten schneller in die Oracle 10g bekommen als ich "DataPumper" sagen könnte...
Mit Skript-Schnipseln, bissi Batch und generierten INSERT-Statements für 32 Mio Datensätze...
Und alle 5000 Datensätze ein COMMIT-Statement streu' ich auch noch rein...

Andererseits: wenn wir beide grad nicht vor Ort auf Feinheiten achten können, dann wären doch auch z.B. SQL-Clients, die mehr als eine Connection gleichzeitig aufmachen können eine etwas flexiblere Alternative.

So etwas wie "DBVisualizer" oder "SQLTools" oder "SQLWorkbench" oder oder oder...

Die beiden (physikalischen) Server werden doch wohl jeweils eine IP haben und einen Service am Fliegen...

...ja, muss ich denn auf meine alten Tage noch irgendwelche chr(0)'s aus Texten rausflöhen?

Gruß
Biber
Bitte warten ..
Mitglied: eagle303
06.06.2007 um 12:49 Uhr
Danke für die schnelle und funktionsfähige Auskunft!

Ich steig mal bei eurer Diskussion mit ein. Ihr meint es gibt elegantere Lösungen so ne Export/Import Geschichte. Bei mir besteht folgendes Szenario: 3 Server. Auf einem läuft
MS-SQL, auf dem zweiten ORACLE und auf dem dritten soll automatisiert ein Import von
der MS-DB in die Oracle-DB ablaufen.
Wie ist sowas realisierbar? (Mach auch gerne nen neuen Eintrag unter Datenbanken auf)

Andererseits funktioniert mein Script auch noch nicht sauber. In der Datei, die ich einlese,
ist ganz am Ende nochmal ein Zeilenumbruch. Der bringt mir die Textdatei, aus was für
Gründen auch immer, komplett durcheinander. Entferne ich den Zeilenumbruch läuft alles
einwandfrei.

Entweder müsst Ihr mir nochmal bei dem Script helfen oder bei der eleganteren Lösung

Grüße
eagle303
Bitte warten ..
Mitglied: bastla
06.06.2007 um 16:53 Uhr
Hallo eagle303!

Obwohl ich eigentlich nicht muss, werde ich trotzdem versuchen, etwas zu Deinem Script beizutragen:

Unter der Annahme, dass deine ".cvs"-Datei ansonsten keine Leerzeilen enthält und Du sie bisher schon zeilenweise durchgehst, könntest Du das Schreiben in die neue Datei davon abhängig machen, dass die Zeile nicht leer ist:
01.
If Zeile <> "" Then objOutFile.WriteLine Zeile
Um auch Zeilen, die nur Leerstellen enthalten, auszuschließen, wäre noch ein zusätzliches "Trim()" möglich, also
01.
If Trim(Zeile) <> "" Then objOutFile.WriteLine Zeile
Soll tatsächlich nur eine Zeilenschaltung (CRLF) ganz am Ende entfernt werden, könnte ein eigenes Script (gleich kombiniert mit dem Beispiel oben) so aussehen:
01.
'Ersetze alle 
02.
strToReplace = Chr(0) 
03.
'durch 
04.
strReplaceBy = "<NULL>" 
05.
 
06.
'Schneide am Ende weg 
07.
strToCut = vbCrLF 'oder auch nur Chr(10) 
08.
intCutLen = Len(strToCut) 
09.
 
10.
If WScript.Arguments.Count < 1 Then 
11.
    WScript.Echo "Bitte eine Textdatei als Argument übergeben!" 
12.
    WScript.Quit(1) 
13.
Else 
14.
strInFile = WScript.Arguments(0) 
15.
End If 
16.
Set fso = CreateObject("Scripting.FileSystemObject") 
17.
If Not fso.FileExists(strInFile) Then 
18.
    WScript.Echo "Die Datei " & strInFile & " wurde nicht gefunden!" 
19.
    WScript.Quit(1) 
20.
End If 
21.
 
22.
Set objInFile = fso.GetFile(strInFile) 
23.
strOutFile = objInFile.Path 
24.
'Lösche alte Sicherungskopie 
25.
If fso.FileExists(objInFile.Name & ".bak") Then fso.DeleteFile(objInFile.Name & ".bak") 
26.
objInFile.Name = objInFile.Name & ".bak" 
27.
 
28.
strFileText = fso.OpenTextFile(objInFile.Path, 1).ReadAll 
29.
strFileText = Replace(strFileText, strToReplace, strReplaceBy) 
30.
If Right(strFileText, intCutLen) = strToCut Then 
31.
    strFileText = Left(strFileText, Len(strFileText) - intCutLen) 
32.
End If 
33.
fso.OpenTextFile(strOutFile, 2, True).Write strFileText
Grüße
bastla
Bitte warten ..
Mitglied: 48558
14.06.2007 um 06:44 Uhr
Hallo, ich hab auch noch ne Frage
Ich will alle vbInformation's durch 64er ersetzen
Alle Exclamation durch 48 ersetzen.Bei mir geht das irgendwie net
Könnt ihr mir helfen?
Bitte warten ..
Mitglied: bastla
14.06.2007 um 08:30 Uhr
Hallo Yugius!

Empfehlen würde ich es Dir nicht - der Code ist mit den vbKonstanten eindeutig besser lesbar.
Wenn es in einem Einzelfall tatsächlich nötig erscheinen sollte, kannst Du ja im Editor ein "Suchen/Ersetzen" drüberlaufen lassen.
Ist das noch immer nicht in Deinem Sinn, dann eben nach obigem Muster:
01.
strNeueZeile = Replace(strAlteZeile, "vbExclamation", "48")
Das Drumherum bleibt im Prinzip gleich.

Grüße
bastla
Bitte warten ..
Mitglied: 48558
14.06.2007 um 13:09 Uhr
Ich dacht mir, das ich ein Skript drufziehe und Schwupps - ALles ist bearbeitet.
Es sind nicht nur die vbKonstanten.War nur ein Beispiel.

Könntst du mir den Gefallen tun und mir nochmal das gesamte Script posten.
Allein krieg ichs immer noch nicht hin ;)
Bitte warten ..
Mitglied: bastla
14.06.2007 um 14:12 Uhr
Hallo Yugius!

Wie gesagt: Eigentlich das Gleiche wie oben ...
01.
If WScript.Arguments.Count < 1 Then 
02.
    WScript.Echo "Bitte eine Datei als Argument übergeben!" 
03.
    WScript.Quit(1) 
04.
Else 
05.
strInFile = WScript.Arguments(0) 
06.
End If 
07.
Set fso = CreateObject("Scripting.FileSystemObject") 
08.
If Not fso.FileExists(strInFile) Then 
09.
    WScript.Echo "Die Datei " & strInFile & " wurde nicht gefunden!" 
10.
    WScript.Quit(1) 
11.
End If 
12.
 
13.
Set objInFile = fso.GetFile(strInFile) 
14.
strOutFile = objInFile.Path 
15.
'Lösche alte Sicherungskopie 
16.
If fso.FileExists(objInFile.Name & ".bak") Then fso.DeleteFile(objInFile.Name & ".bak") 
17.
objInFile.Name = objInFile.Name & ".bak" 
18.
 
19.
'Datei einlesen 
20.
strFileText = fso.OpenTextFile(objInFile.Path, 1).ReadAll 
21.
 
22.
'ab hier die Ersetzungen 
23.
strFileText = Replace(strFileText, "vbExclamation", "48") 
24.
strFileText = Replace(strFileText, "vbInformation", "64") 
25.
'strFileText = Replace(strFileText, ..... 
26.
 
27.
'Datei schreiben 
28.
fso.OpenTextFile(strOutFile, 2, True).Write strFileText
"Schwupps" sollte jetzt klappen ...

Grüße
bastla

P.S.: Ich finde die Idee, benannte Konstanten zu ersetzen (auch wenn nur als Beispiel), weiterhin nicht gut.
Bitte warten ..
Mitglied: eagle303
15.06.2007 um 15:03 Uhr
Hi,

so jetzt klappt alles endlich so wie ich das will.

DANKE!!!!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Webentwicklung
gelöst HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Batch & Shell
Merkwürdige Zeilenformatierung in txt Datei (3)

Frage von miczar zum Thema Batch & Shell ...

Batch & Shell
gelöst In Batchdatei Variablen befüllen - mit Werten aus einer TXT-Datei (6)

Frage von donnyS73lb zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...