2017-07-04 8 views
0

J'ai fichier, où j'ai séparé les valeurs via "," - mais ce n'est pas l'extension .csv.
Je suis en train de faire en C# somme de chaque ligne, qui partent de 0.Lire la valeur à partir du fichier, après 12 fois ","

Pour cette somme, il convient de prendre toujours la valeur après 12 « »

0,P2CZ,1,0,400,400,802,802,18,18,1299,,5,248721,2487221,2 
1,1,2487221,1,1_EG_3ST2_1/22,,0,460,18,0 
0,,2,0,400,400,982,982,18,18,13999,,9,2321,248731,24878/121,24872021,,,,,, 
1,1,2482021,1,1_EG_9_ST2_1/22,,0,460,18,0 
1,3,2487821,1,1_EG_U9_ST2_1/22,,0,1042,18,0 
1,4,248781,1,1_EG_U9_ST2_1/22,,0,1042,18,0 
0,,3,0,2000,2000,80,80,18,18,14/0999,,1,,,,,,,,,,2000,80,1.3,,,,0,0,,, 

donc dans ce style :

  • 1er rang, après le 12 "" est la valeur "5",
  • 2ème rang sauté, en raison de 1 au début,
  • 3ème rang, après le 12 "" Est la valeur "9",
  • 4-6 rangées sautées, en raison de 1 à l'origine,
  • septième ligne, après le 12 "" est "1"

Donc somme est 5 + 9 + 1 = 15.

J'ai déjà entré des lignes de lecture avec des données patch + extraites de + et d'extension.

Mais après? Comment dois-je gérer cela?

int count = File.ReadLines(patch + label97.Text + ".ext").Count(line => !line.All(char.IsWhiteSpace)); 

Répondre

0

Pour commencer, vous devez faire ceci:

File.ReadLines(patch + label97.Text + ".ext") 
    .Where(line => !line.StartsWith("1") // get lines that do not start with 1 
    .ToArray(); 

Puis, en utilisant l'instruction de boucle de votre choix:

var desiredPart = line.Split(new[] { ',' })[11]; // get whatever is at the twelveth position 
int value = int.Parse(desiredPart); 

Bien sûr, vous devez vérifier que Split vous donne en fait 12 positions et si c'est un numéro ou non.

+0

Comme je l'ai mentionné dans un commentaire, je suggère d'utiliser votre approche OP, mais avec un contrôle complémentaire de la ligne coupée en deux. Je Suis sur un téléphone donc je ne peux pas lui donner un exemple ... – Nino

0

Vous devez d'abord effectuer une division de chaîne sur le caractère ',' et enregistrer la chaîne fractionnée en tant que tableau. Ensuite, vous pouvez accéder au 0ème élément pour voir s'il est 0 ou 1, puis au 12ème élément pour faire la somme.

0

Si nous supposons fichier est au format correct et que sur toutes les positions 12, vous trouverez nombre entier, vous pouvez le faire avec une seule ligne (rapide et sale)

var sum = File.ReadLines(patch + label97.Text + ".ext") 
    .Where(l =>!l.StartsWith("1")) 
    .Sum(l => int.Parse(l.Split(',')[11]); 

garder à l'esprit que cette volonté lancer une exception si une seule chose n'est pas comme prévu (mauvais nom de fichier, mauvaise position, chaîne sur la 12e position au lieu du nombre, etc.).

+0

Est-ce que LinQ (en plus d'être jolie), il est difficile d'ajouter ca cks? Je ne vois pas comment commencer facilement en utilisant int.TryParse ou vérifiez qu'il a réellement 12 positions sans dupliquer la partie divisée –

+0

@CamiloTerevinto comme je l'ai dit, c'est une solution rapide et sale qui suppose que tout est à sa place. Analyser csv de cette façon est généralement mauvaise idée, peu importe le Linq. Mais, comme démonstration, cela fera – Nino

+0

Je suis conscient de cela, je voulais juste voir si vous aviez plus de trucs LinQ :) –

0


si dans ce dossier, le 11 ou 12e position, je dois par exemple pas « 16 », mais « 1:59 » (soit 1 minute et 59 secondes?
VS m'a donné les informations que la production non correcte avec dépannage sur la date.
j'ai essayé decimal.Parse et DateTime.TryExact, mais le même problème.

var test2 = File.ReadLines(path + label97.Text + ".ptn") 
    .Where(l => l.StartsWith("SUM1")) 
    .Sum(l => DateTime.ParseExact(l.Split(',')[11]));