2017-08-04 3 views
0

J'ai implémenté une fonction dans une application de formulaire Windows pour capturer et lire les données tabulaires nécessaires à partir d'un fichier (sourcedata.data) et l'enregistrer dans un autre fichier (result.data). Comment puis-je et en utilisant l'application peut capturer un flux de données en temps réel comme celui disponible ici: https://data.sparkfun.com/streams en csv ou fichier .data pour l'utiliser. Ou existe-t-il un moyen direct de lire périodiquement les données du flux provenant directement de la source du site Web?comment capturer des données de flux en temps réel dans un fichier csv ou .data dans un formulaire Windows Application

private void button5_Click(object sender, EventArgs e) 
{ 
    List<string[]> rows = new List<string[]>(); 
    int[] indexes = { 0, 1, 3, 5, 6, 7, 8, 9 }; 
    using (var reader = new StreamReader(@"sourcedata.data")) 
    { 
     using (StreamWriter writetext = new StreamWriter("result.data")) 
     { 
      while (!reader.EndOfStream) 
      { 
       var line = reader.ReadLine(); 
       if (line.IndexOf(',') == -1) 
        continue; 

       string[] values = line.Split(','); 
       string[] row = new string[indexes.Length]; 
       int insertIndex = 0; 
       for (int i = 0; i < values.Length; i++) 
       { 
        string val = values[i]; 

        if (val.Trim() == "?") 
         goto BREAK; 

        if (indexes.Contains(i)) 
         row[insertIndex++] = val; 
       } 
       rows.Add(row); 
       writetext.WriteLine(String.Join(",", row)); 
       BREAK:; 
      } 
     } 
    } 
} 
+0

vous devez exécuter en arrière-plan. google pour le travailleur en arrière-plan, ou apprenez comment démarrer les threads directement – pm100

+0

que devraient faire les threads? peux-tu me guider vers des références utiles? – Alex

Répondre

0

Vous avez deux diviser votre problème en deux problèmes sous séparés:

  1. écrire une méthode public static string DownloadData(...) qui téléchargera les données de la source. Cela peut être fait par n'importe quel client HTTP ou une bibliothèque que vous pouvez trouver comme System.Net.Http.HttpClient ou System.Net.WebClient.

  2. Ajouter/démarrer une minuterie qui appelle cette méthode périodiquement. Vous pouvez utiliser des classes telles que System.Windows.Forms.Timer ou System.Timers.Timer.

+0

Y a-t-il un moyen direct de lire périodiquement les données du flux directement depuis la source du site? – Alex

+0

@Alex Comme je l'ai écrit ci-dessus, vous devez écrire un code qui télécharge le contenu et un autre code qui appelle cette méthode. Il n'y a pas de méthode 'DownloadDataPeriodicallyFromAServer (url, time)'. – Progman

+0

J'ai implémenté une fonction pour télécharger les fichiers avec succès, mais les fichiers csv du site ne peuvent pas être téléchargés! – Alex

0

@Progman Il est le code

public partial class Download : Form 
{ 
    public Download() 
    { 
     InitializeComponent(); 
    } 

    WebClient client; 
    private void btnDownload_Click(object sender, EventArgs e) 
    { 
     string url = txtUrl.Text; 
     if (!string.IsNullOrEmpty(url)) 
     { 
      Thread thread = new Thread(() => 
      { 
       Uri uri = new Uri(url); 
       string filename = System.IO.Path.GetFileName(uri.AbsolutePath); 
       client.DownloadFileAsync(uri, Application.StartupPath + "/" + filename); 

      }); 
      thread.Start(); 
     } 

    } 

    private void Download_Load(object sender, EventArgs e) 
    { 
     client = new WebClient(); 
     client.DownloadProgressChanged += Client_DownloadProgressChanged; 
     client.DownloadFileCompleted += Client_DownloadFileCompleted; 
    } 

    private void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) 
    { 
     MessageBox.Show("Download Completed.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information); 

    } 

    private void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
    { 
     Invoke(new MethodInvoker(delegate() 
     { 
      progressBar.Minimum = 0; 
      double recieve = double.Parse(e.BytesReceived.ToString()); 
      double total = double.Parse(e.TotalBytesToReceive.ToString()); 
      double percentage = recieve/total * 100; 
      lblStatus.Text = $"Download {string.Format("{0:0.##}", percentage)}%"; 
      progressBar.Value = int.Parse(Math.Truncate(percentage).ToString()); 
     })); 
    } 
}