Seite 1 von 1

csv-Datei downloaden

Verfasst: 25. Oktober 2014 00:27
von dolin93
Hallo,
mit php habe ich mir ein Programm erstellt, das von Yahoo finance für mehrere Aktien die historischen Kursdaten herunterlädt und auswertet etc.. Da für mathematische Anwendungen C++ viel besser ist, würde ich dies gerne mit Qt Networking versuchen, aber leider gelingt es mir nicht. In php schreibt man z.B. einfach

Code: Alles auswählen

$Name="SIE.DE"
$fileHandle = fopen ("http://ichart.finance.yahoo.com/table.csv?s=$Name&d=20&e=6&f=2014&g=d&a=17&b=9&c=2014&ignore=.cvs","r");
{$Kurse = fgetcsv ($fileHandle, 999999, ",");
$Zeilen[$Tage]=$Kurse;
$Tage++;
}while($Kurse)
In Qt geht natürlich mit

Code: Alles auswählen

ifstream input("http://ichart.finance.yahoo.com/table.csv?s=AAPL&d=20&e=6&f=2014&g=d&a=17&b=9&c=2014&ignore=.cvs",ios::in);
nichts. Bis jetzt habe ich noch keine Beschreibung gefunden, aus der hervorgeht, mit welchen Anweisungen ich die Kurse in mein Programm bringe, so daß ich sie dann z.B in einem QVector speichern kann.
Für nützliche Hinweise wäre ich sehr dankbar.

Re: csv-Datei downloaden

Verfasst: 25. Oktober 2014 07:41
von sirop
Schau:

Code: Alles auswählen

void Download::downloadFile(const QUrl &Url, const QString &dir)

{

    url = Url;

 

    QFileInfo fileInfo(url.path());

    QString fileName = fileInfo.fileName();

    if(fileName.isEmpty())

        fileName = "unknown.file";

 

    if(!dir.isNull())

        fileName = dir + "//" + fileName;

 

    if(QFile::exists(fileName))

    {

        int i = 0;

        fileName += ".";

 

        while(QFile::exists(fileName + QString::number(i)))

            ++i;

 

        fileName += QString::number(i);

    }

 

    file = new QFile(fileName);

    if(!file->open(QIODevice::WriteOnly))

    {

        delete file;

        file = 0;

        return;

    }
http://qt-project.org/forums/viewthread/16749

Re: csv-Datei downloaden

Verfasst: 29. Oktober 2014 00:15
von dolin93
Vielen Dank für Deine Hilfe!
Leider habe ich es noch nicht geschafft, die gewünschten Daten mit Qt/C++ auf den Computer zu bringen. Ich habe anfangs mit Deinem Programmentwurf eine Klasse, aber dann eine Funktion geschrieben und mußte wegen Fehlermeldungen kleine Änderungen vornehmen bzw.einen Teil mit // ganz ausschalten. Wenn ich das Programm

Code: Alles auswählen

#include <QtCore/QCoreApplication>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <QtNetwork>
#include <QDebug>
using namespace std;


void  downloadFile(const QUrl &Url, const QString &dir)
{

    QUrl url = Url;



    QFileInfo fileInfo(url.path());

    QString fileName = fileInfo.fileName();

    if(fileName.isEmpty())

       { fileName = "unknown.file";}

   qDebug()<<"!!!!!!!!!"<<fileName;

    if(!dir.isNull())

    {fileName = dir + "//" + fileName;}

    qDebug()<<"????????"<<fileName;

    if(QFile::exists(fileName))

    {

        int i = 0;
        qDebug()<<"i="<<i;
        fileName += ".";

        qDebug()<<"#########"<<fileName;

        while(QFile::exists(fileName + QString::number(i)))

            ++i;


        qDebug()<<"*******"<<fileName;
        fileName += QString::number(i);

    }



    //QFile file = new QFile(fileName);

    //if(!file->open(QIODevice::WriteOnly))

    //{

      //  delete file;

        //file = 0;

       // return;

    //}
}
  int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);

  char separator, step='d',tags;
  string symbol="AAPL";
  int startDay=20,startMonth=7,startYear=2014,endDay=17, endMonth=10,endYear=2014,sM,eM;
 sM=startMonth-1;
 eM=endMonth-1;
 QUrl histUrl("http://ichart.finance.yahoo.com/table.csv?s=AAPL&d=20&e=6&f=2014&g=d&a=17&b=9&c=2014&ignore=.cvs");
 downloadFile(histUrl,"");

  return a.exec();
}
laufen lasse, dann erhalte ich die Ausgabe

Code: Alles auswählen

!!!!!!!!!"table.csv"
????????"//table.csv" 
und mehr nicht. Der Block

Code: Alles auswählen

 int i = 0;
        qDebug()<<"i="<<i;
        fileName += ".";

        qDebug()<<"#########"<<fileName;

        while(QFile::exists(fileName + QString::number(i)))

            ++i;


        qDebug()<<"*******"<<fileName;
        fileName += QString::number(i); 
wird offensichtlich gar nicht durchlaufen.

Re: csv-Datei downloaden

Verfasst: 29. Oktober 2014 06:30
von Christian81
Zum Herunterladen einer Datei benutzt man den QNetworkAccessManager: https://qt-project.org/doc/qt-4.8/qnetw ... nager.html
In der Beschreibung steht auch ein gutes Beispiel wie man die Website von (damals noch) nokia herunterlädt.

Der Code, der da oben steht und auch die Funktion downloadFile() sind der Teil, in dem das Reply ausgewertet wird...

Re: csv-Datei downloaden

Verfasst: 30. Oktober 2014 00:19
von dolin93
Vielen Dank für Deinen Hinweis!
Inzwischen bringe ich mit dem sich im Anhang befindenden Programm die gewünschten Daten auf den Computer, aber leider nicht nur die Daten vom 20.7.2014 bis 17.10.2014, wie im Programm gefordert, sondern alle bis zum Jahre 1981. Vielleicht weiß jemand, was ich ändern muß und wie ich die Daten am elegantesten in das Hauptprogramm bringe; denn mit meiner sonst angewendeten Vorgehensweise wird es in diesem Fall etwas umständlich.
Mit freundlichen Grüssen
dolin93

Re: csv-Datei downloaden

Verfasst: 30. Oktober 2014 00:56
von veeman
Du solltest Übersichtshalber mal die Parameter a,b,c,d, etc in der Reihenfolge lassen.

Du kriegst die komplette Liste weil du Monat und Tag vertauscht hast.

Nen int Wert kriegst mittels QString::arg() in einen String den du als URL verwenden kannst.

Re: csv-Datei downloaden

Verfasst: 1. November 2014 00:09
von dolin93
Vielen Dank für Deine Hilfe!
Da es beim Posten ungefähr Mitternacht war, so hatte die Aufmerksamkeit schon etwas nachgelassen. .Inzwischen sind diese Probleme beseitigt, und das QByteArray in Vektoren und eine Liste zu zerlegen, scheint auch zu klappen. Leider habe ich bis jetzt mit meiner sonst üblichen Vorgehensweise das QByteArray noch nicht ins Hauptprogramm gebracht.
Die momentane Version habe ich angehängt. Für nützliche Hinweise wäre ich sehr dankbar.
Mit freundl. Grüssen
dolin93