2010-05-04 5 views
0

Je dois gérer des fichiers TXT dat provenant d'un périphérique embarqué, Mon problème est que cet appareil envoie toujours toutes les données capturées mais je ne veux prendre que des différences entre deux faire des calculs sur eux. Après le calcul, je l'envoie à SQL en utilisant la fonction bulkinsert. Je veux extraire des données qui sont différentes selon le premier fichier que j'ai reçu de l'appareil. Lats dire que le dispositif premier dispositif de temps envoyer des données comme celui-ci dans some.dat (ASCII) fichierComment comparer deux fichiers TXT avant de l'envoyer à SQL

0000199991 
0000199321 
0000132913 
0000232318 
0000312898 

Le deuxième appel pour obtenir des données de dispositif, il va revenir tout nouveau (précédent et suivant capturé des documents) quelque chose comme ce

0000199991 
0000199321 
0000132913 
0000232318 
0000312898 
9992129990 
8782999022 
2323423456 

Mais cette fois je veux seulement calculer et passer les données de creux ajoutées après la première insertion. J'essaie de faire l'application Win Forms en utilisant C# et Visual Studio 2008

+0

Merci à toutes les bonnes réponses, je me bats ici avec la grammaire anglaise et somnoler, j'ai oublié de faire mention de périphérique Parfois, obtenir redémarré et envoyer seulement de nouvelles données, également jusqu'à présent je charge les données à l'ensemble de données de ne pas piquer , Si je charge le fichier à sting sera lourd après cela pour le convertir en ensemble de données afin que je puisse l'envoyer à SQL. – adopilot

+0

S'il vous plaît nous montrer votre code actuel. – SLaks

+0

En ce qui concerne le code de spectacle, mes mains sont attachées jusqu'au matin quand je suis arrivé au bureau, pardonnez-moi sur cela, la première chose le matin – adopilot

Répondre

3

Vous pouvez le faire en utilisant LINQ:

string[] addedLines = File.ReadAllLines(secondPath) 
          .Except(File.ReadAllLines(firstPath)) 
          .ToArray(); 

Notez que ce sera lent pour les gros fichiers.

Pour les gros fichiers, remplacez ReadAllLines par la méthode suivante: (en .Net 4, vous pouvez utiliser à la place File.ReadLines)

static IEnumerable<string> EnumerateLines(string path) { 
    using(var reader = File.OpenText(path)) { 
     string line; 
     while(null != (line = reader.ReadLine()) 
      yield return line; 
    } 
} 
+0

Est-ce que 3 à 5 mille dossiers en considérant les grands fichiers – adopilot

+0

voyez s'il court trop lentement. – SLaks

+0

Pourtant pendant que j'essaie d'implémenter Votre première méthode, Et cela fonctionne bien, une seule chose que je ne comprends pas est: Quand j'utilise Except dans les expressions lambda comment le tableau addedLines est groupé par les mêmes enregistrements. Est-il possible d'éviter de regrouper des données dans un nouveau tableau et d'utiliser encore Except, Thanx beaucoup – adopilot

1

Une option serait de se souvenir de la taille du fichier chaque fois que vous recevez le fichier, puis lorsque vous obtenez le nouveau fichier, vous pouvez immédiatement déplacer le pointeur de fichier sur le position dans le fichier qui correspond à la fin du fichier précédent et lire à partir de ce point.

Voici une esquisse de l'idée

long lastPosition = GetLastFilePositionFromDatabase(); 
    using (FileStream fs = new FileStream(...)) 
    { 
    // Seek to the last position, this is zero the first time 
    fs.Seek(lastFilePosition, SeekOrigin.Begin); 

    // Process your file from the current position 
    ProcessFile(fs); 

    // Once you reach the end of the file, save this position so 
    // for use with the next file 
    SaveLastFilePositionToDatabase(fs.Position); 
    } 
1

Est-ce que ce travail pour vous?

string dataAddedAfterFirstInsert = secondString.SubString(firstString.Length, secondString.Length) 
+0

La sous-chaîne a un 'S'. – SLaks

+0

Malheureusement, je ne sais pas maintenant, péage demain Quand je suis de retour au bureau pour essayer – adopilot