2017-10-06 7 views
-2

J'ai vu de nombreux sujets sur le tri d'un onglet délimité, mais j'ai été incapable de saisir ou de comprendre la tâche pour terminer ce morceau de code et je commence juste en C#. J'espère que quelqu'un peut répondre à cette question.C# trier un fichier délimité par des tabulations

Je souhaite ouvrir un fichier texte délimité par des tabulations avec un nombre spécifique de champs. Les questions sont comment puis-je le trier avec le champ de la première colonne, puis en utilisant une deuxième colonne. Je voudrais pouvoir voir les champs dans un tableau de liste, pour le débogage, si c'est possible. J'espère que cet exemple apparaîtra comme délimité par des tabulations. Ensuite, bien sûr, je veux être en mesure de l'écrire.

Category Name Category Sub Name Family Sales Description Equipment Tag List Price Price ID 
Fixture Type 2 Basket Sales B2 65 64 366589 
Fixture Type 2 Basket Sales B2 65 64 366595 
Fixture Type 2 Basket Sales B2 65 64 366601 
Fixture Type 2 Basket Sales B2 65 64 366607 
Fixture Type 2 Basket Sales B2 65 64 366613 
Fixture Type 22 Rail Sales X1 10 10 382822 
Device Type 1 Wall Outside Null 360 342 400604 
Device Type 3 Standard Outside Null 180 171 400885 
Device Type 1 Wall Outside Null 360 342 400965 
Device Type 1 Wall Outside Null 360 342 401034 
Device Type 1 Wall Outside Null 360 342 401303 
Device Type 3 Standard Standard Null 180 171 401471 
Device Type 1 Wall Outside Null 360 342 401596 
Device Type 3 Standard Standard Null 180 171 401753 
Device Type 3 Standard Standard Null 180 171 401866 
Device Type 1 Wall Outside Null 360 342 402189 
Device Type 3 Standard Standard Null 180 171 402537 
Device Type 1 Wall Outside Null 360 342 402685 
Device Type 1 Wall Outside Null 360 342 402930 
Device Type 1 Wall Outside Null 360 342 402952 
Device Type 3 Standard Standard Null 180 171 403164 
Device Type 1 Wall Outside Null 360 342 403234 
Device Type 3 Standard Standard Null 180 171 403303 
Device Type 1 Wall Outside Null 360 342 403473 
Fixture Type 4 Standard Null F1 140 137 406101 
Fixture Type 4 Step Null F1 140 137 406102 
Fixture Type 4 Step Null F1 140 137 406103 
Fixture Type 4 Step Null F1 140 137 406104 
Fixture Type 4 Step Null F1 140 137 406105 
Fixture Type 4 Step Null F1 140 137 406106 
Fixture Type 4 Step Null F1 140 137 406124 
Fixture Type 4 Step Null F1 140 137 406125 
Fixture Type 4 Step Null F1 140 137 406126 
Fixture Type 4 Step Null F1 140 137 406127 
Fixture Type 4 Step Null F1 140 137 406128 
Fixture Type 4 Step Null F1 140 137 406129 
+0

Vous ne pouvez pas simplement demander aux gens de faire le travail pour vous. Qu'avez-vous essayé jusqu'ici qui n'a pas fonctionné pour vous? Avez-vous cherché des solutions pour cela quelque part que vous avez essayé et n'a pas fonctionné? –

+0

Je vois ce que vous dites. Bon point. Je ne peux pas sembler poster un échantillon codé ici, je l'ai été et la recherche de plusieurs jours à ce sujet. –

+0

Ceci est une recherche google commune et tous les résultats que je suis revenu avec n'ont pas fourni de solutions qui semblent d adapter à mon cas. "Lire et trier un csv C#" –

Répondre

1

Comme dit ci-dessus - vous ne pouvez pas vraiment attendre les gens à faire le travail pour vous ... mais je me suis ennuyé.

Voici une solution simple sous la forme d'une application de console complète qui s'effondrera probablement à la seconde où vous lui donnez des données réelles, mais qui, espérons-le, vous aidera à démarrer.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     //Read file 
     var fileContents = File.ReadAllText("file.txt"); 

     //split on carriage returns and line feeds, remove empty entries. 
     var lines = fileContents.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); 

     //Split each line on Tab 
     var splitLines = lines.Select(l => l.Split(new[] { '\t' }, StringSplitOptions.RemoveEmptyEntries)); 

     //splitLines is now an array of arrays. Each splitLine entry is a line, and each entry of each splitline element is 
     //a single field... so we should be able to sort how we want, e.g. by first field then by second field: 
     var sortedLines = splitLines.OrderBy(sl => sl[0]).ThenBy(sl => sl[1]); 

     //put back together as TSV - put tabs back. 
     var linesWithTabsAgain = sortedLines.Select(sl => string.Join("\t", sl)); 

     //put carriage returns/linefeeds back 
     var linesWithCRLF = string.Join("\r\n", linesWithTabsAgain); 

     File.WriteAllText("newFile.txt",linesWithCRLF); 


    } 
} 
} 
+0

:) Vous avez fait mes jours. Merci beaucoup d'avoir posté. Fonctionne très bien. Je faisais des recherches depuis presque une semaine et je n'ai jamais rien trouvé. –

+0

J'espère que quelqu'un le trouve aussi utile que moi aussi. –

+0

De rien. Plutôt que de trier les données, transformez-les en quelque chose de triable, triez-les puis convertissez-les à nouveau. Évidemment, cette approche ne serait pas géniale si les données sources sont énormes car elles chargent tout le contenu en mémoire ... si vous avez des problèmes de mémoire, il vaudrait probablement mieux les charger dans une base de données pour trier les données. petit exercice intéressant pour un vendredi après-midi :) – GPW