SQL-Code in Javascript-Code durch das hinzufügen und erstzen von strings

flo0702

Neues Mitglied
Hallo, ich habe ein Programm geschrieben, welches eine Datei einließt, den string kurz verarbeitet und anschließend in eine neue Datei, den Text und die angehängten Strings schreibt. Es funktioniert auch einwandfrei, ABER die erste Zeile wird falsch in die Datei geprintet und ich finde den Fehler nicht. Ich freue mich über jede konstuktive Antwort. Bitte keine sinnfreien Kommentare. Vielen Dank schonmal.

Der Code:
C++:
#include <fstream>
#include <iostream>
#include <array>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string replaceAll(string subject, string search, string replace) { //funktion, die string sucht und erstezt
    int pos = 0;
    // funktion find gibt "string::npos if not found"
    while ((pos = subject.find(search, pos)) != string::npos) {
        //cout << "pos: " << pos << " - search: " << search << " - replace: " << replace << " - row: " << row;
        subject.replace(pos, search.length(), replace);
        pos += replace.length();
    }//cout << endl;
    return subject;
}

int main()
{
    vector<string> text;
    vector<string> temp;
    string line1, line2, runtime = "Runtime.ExecuteQuery(\"", end = "\");";
    array<string, 3> query = { "INSERT", "DELETE", "UPDATE" };
    int i = 0;
    cout << "Dateiname(input) ist dein SQL Befehl in Datei\n";
    cout << "Dateiname(output) ist deine neue Datei.\n" << "\n\t\tHINWEIS: Dateiendung auch eingeben!\n";
    cout << "Dateiname(input):";
    cin >> line1;
    ifstream input(line1, ios::in);//input modus zum lesen
    if (!input.is_open())//prüfe ob öffnen fehlerfrei war
    {
        cout << "Dateifehler oder Datei nicht gefunden!(input)" << endl;
        return 1;
    }
    cout << "Dateiname(output):";
    cin >> line2;
    fstream output(line2, std::ios::out); //output modus zum erstellen/schreiben

    if (!output.is_open())//prüfe ob öffnen fehlerfrei war
    {
        cout << "Dateifehler oder Datei nicht gefunden!(input)" << endl;
        return 1;
    }

    while (getline(input, line1))//text in array
    {
        line2 = replaceAll(line1, "\"", "\\\"");//setzt das \ vor das "
        text.push_back(line2);
    }

    for (int j = 0; j < (int)text.size(); j++) {
        if (text[j].find(query[0], 0) != string::npos) i = 0;//Gibt korrekten index für aktuellen loop
        else if (text[j].find(query[1], 0) != string::npos) i = 1;
        else if (text[j].find(query[2], 0) != string::npos) i = 2;

        if (string::npos != text[j].find(query[i], 0))
        {
            output << runtime << text[j];//runtimestring+formatierter text, wenn keyword gefunden
        }

        if (string::npos == text[j].find(query[i], 0))
        {
            output << text[j];//wenn kein keyword, formatierten text anhängen
        }

        if (j < ((int)text.size() - 1) && ((string::npos != text[j + 1].find(query[0], 0)) || (string::npos != text[j + 1].find(query[1], 0)) || (string::npos != text[j + 1].find(query[2], 0)))) output << end << '\n';//falls folgezeile key hat, ende anhängen und umbruch

        if (j == ((int)text.size() - 1)) output << end << '\n';       
    }

    input.close();
    output.close();
    return 0;
}

PS: Es wird nach den Schlüsselwörtern gesucht, da die Ursprungsdatei mit den SQL-Befehlen unnötig viele Zeilenumbrüche hat, die JavaScript nicht aktzeptiert und deshalb hat der eingelesene Text x mal so viele Zeilen wie der Output.
 
Kannst du mal eine Beispieleingabedatei einzippen und anhängen? Kann gekürzt und anonymisiert sein. Hauptsache man kann den Fehler reproduzieren, damit wir wissen was "die erste Zeile wird falsch in die Datei geprintet" bedeutet und ob das Problem vielleicht schon in der Eingabedatei zu suchen sein könnte.
 
Klar, das ist meine Beispieldatei, ich weiß da stehen nur Insert Befehle jetzt drin, aber das ist erstmal egal. Der Fehler ist in der ersten Zeile am Ende des Strings. Ich benutze Notepad++ um mir die Inhalte anzeigen zu lassen, da andere Programme, wegen der Zeilenlänge Umbrüche bei der Ansicht einfügen.
 

Anhänge

  • SQLCode-Beispiel.txt
    49,8 KB · Aufrufe: 292
  • a.txt
    50,1 KB · Aufrufe: 287
Wie @german geschrieben hat, liegt das Problem wohl in der Eingabedatei.

Die 1. Zeile hat ein "); am Ende

Wenn du Notepad++ hast, müsstest du da SQL als Syntaxerkennung aktivieren können. Der hebt dir dann Elemente farblich hervor und du erkennst auf den ersten Blick, wo Strings anfangen und wo sie enden.

Ist das ein Copy&Paste-Fehler oder kriegst du die Quelldateien manchmal in der Form? Dann müsstest du schauen, ob der Fehler in den Quelldateien immer gleich aussieht und eventuell nach );"); am Zeilenende suchen und das durch ); ersetzen.
 
Das Problem war wohl ich, den Fehler in der Textdatei hab ich nämlich schon gefunden bevor ich diesen Beitrag erstellt hab und auch behoben, nur nicht gespeichert....
Ich hab es jetzt erst gesehen, als ich die von mir hochgeladene Datei angeschaut habe, dass der Fehler immernoch drin steht.

Danke trotzdem für eure Hilfe!
 
Passiert :)
Dass der Fehler nur in der ersten Zeile auftaucht, ist echt ein gutes Indiz, dass der Fehler nicht unbedingt im Programmcode liegt, darum hatte ich nachgefragt. Alternativ (da du ursprünglich nicht geschrieben hattest wie der Fehler aussieht und an welcher Position er liegt) hätte ich mir jetzt noch in einem HEX Editor angesehen, ob sich ein Byte Order Mark am Dateianfang befindet. Wäre auch eine mögliche, wenn auch unwahrscheinliche Ursache für Mist in der ersten Zeile gewesen.

Paar Anmerkungen vom Überfliegen des Codes (damit du ihn nicht ganz umsonst gepostet hast ;) ):

void replaceAll(string& subject, const string& search, const string& replace) { um Kopieren der Strings zu vermeiden. Die Änderung von subject ist dann direkt in string1 nach dem Aufruf wirksam und string2 ist unnötig. Für search und replace kannst du auch mit std::string_view arbeiten.

IMHO kommst du völlig ohne die Vectoren aus. Einfach direkt in der while Schleife weiter arbeiten.

Den Typecast zu int kannst du dir vermutlich sparen, wenn du alles was aktuell int deklariert ist, std::size_t deklarierst.

Wie ifstream für die Eingangsdatei, kannst du ofstream statt fstream für die Ausgabedatei nutzen. Das ios::in und ios::out ist redundant. Kannst du dann komplett weglassen.
 
Zurück
Oben Unten