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

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, 11331 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 ..
Ähnliche Inhalte
Batch & Shell
Dateinamen mit vbs auslesen und in eine TXT Datei schreiben
gelöst Frage von KeiosIDBatch & Shell5 Kommentare

Hallo, ich hoffe mal, das ist das richtige Unterforum. Nach diversen suchen und Hilfe aus einem Windows Scripting Buch ...

VB for Applications
Per VBS bestimmten Knoten aus XML Datei entfernen
gelöst Frage von aletriVB for Applications9 Kommentare

Guten Morgen allerseits Mit diesem Script möchte ich bestimmten Knoten aus XML Datei entfernen. Der Script wird ohne Fehlermeldung ...

VB for Applications
VBS-Entfernen von Zeilen in einer Textdatei
Frage von Calim3roVB for Applications5 Kommentare

Hallo zusammen Ich möchte aus einer Textdatei Zeilen entfernen. Ich habe drei Dateien, in Datei "A" stehen Wörter, in ...

Drucker und Scanner
Steuerzeichen EPSON LX30+ii
gelöst Frage von gamerffDrucker und Scanner2 Kommentare

Hallo Forum, kann mir jemand bei der Sache Steuerzeichen weiterhelfen? Ich muss von einem Gerät aus einen Text an ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 6 StundenWindows 101 Kommentar

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 8 StundenSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 22 StundenInternet3 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 1 TagDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement21 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

TK-Netze & Geräte
VPN-fähige IP-Telefone
Frage von the-buccaneerTK-Netze & Geräte16 Kommentare

Hi! Weiss noch jemand ein VPN-fähiges IP-Telefon mit dem man z.B. einen Heimarbeitsplatz gesichert anbinden könnte? Habe nur einen ...

Windows Server
Anmeldung direkt am DC nicht möglich
Frage von ThomasGrWindows Server16 Kommentare

Hallo, ich habe bei unserem Server 2016 Standard ein Problem. Keine Ahnung wie das auf einmal passiert ist. Ich ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...