2016-11-21 1 views
0

Je sais que le titre de cette question n'est pas précis, et il doit y avoir un meilleur, mais mon anglais n'est pas si bon. Et aussi cette question peut être dupliquée. Maintenant, la tâche est de lire le fichier csv, format comme suit:Linq pour couper chaque mot dans IList <string[]>

col1, col2 
int1, string1 
int2, string2 

Maintenant, je veux utiliser LINQ pour analyser à IList<string[]>, il est donc facile pour une utilisation ultérieure (chaque ligne se convertir à un objet et il y a beaucoup de ces fichiers csv pour différents types). Code comme suit:

IList<string[]> v = File.ReadAllLines("test.csv").Select(
l => l.Split(new char[] { ',', ',' }, StringSplitOptions.RemoveEmptyEntries) 
//if add this, cannot compile 
//.Select(w => w.Trim()) 
) 
.Skip(1).ToList(); 

Veuillez aider sur la ligne commentée. Je veux couper chaque mot, afin qu'ils puissent être convertis en entiers plus tard. Mais cela ne compilera pas (je sais que la raison peut être que Linq traite w comme IEnumable<Char>, mais comment puis-je atteindre mon objectif en une seule déclaration LINQ?

+0

Soit dit en passant, ne vous souciez de lignes du tout, ou vous voulez juste un tableau avec des mots, après tout? – Evk

+0

une ligne est un objet, et les mots de lignes ne doivent pas se mélanger. –

Répondre

1

Dans votre première tentative, vous avez une erreur dans

l.Split(new char[] { ',', ',' } ... 

depuis ', ' ne peut pas être un seul caractère . Vous voulez quelque chose comme ça

IList<string[]> v = File 
    .ReadLines("test.csv") 
    .Skip(1) // skip titles 
    .Select(line => line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
    .Select(items => items 
    .Select(item => item.Trim()) // trim each item 
    .ToArray()) 
    .ToList(); 

Modifier: une version plus courte suggérée par Evk (voir son commentaire ci-dessous)

IList<string[]> v = File 
    .ReadLines("test.csv") 
    .Skip(1) // skip titles 
    .Select(line => line 
    .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
    .Select(item => item.Trim()) // trim each item 
    .ToArray()) 
    .ToList(); 
+0

Vous pouvez les couper juste après Split (Split(). Select(). ToArray()), sauvera une instruction Select. – Evk

+0

@Evk: Vous avez raison; Je vois. Mais comme la question porte sur 'Trim' et qu'il y a une * erreur * dans le' Split 'initial, j'ai opté pour * deux * 'Select' afin de ne pas avoir le Linq * trop complexe. –

+1

@DmitryBychenko thx, j'essaie votre solution. mais vous vous demandez comment vous dites «ne pas être trop complexe», vous voulez dire qu'il y a une ** voie complexe ** (juste curieuse)? –