2016-11-21 4 views
0

Я знаю, что этот вопрос не является точным, и должен быть лучший, но мой английский не так хорош. А также этот вопрос может быть дублирующим. Теперь задача для чтения CSV-файл, формат, как следующее:Linq обрезать каждое слово в IList <string[]>

col1, col2 
int1, string1 
int2, string2 

Теперь я хочу использовать Linq для разбора в IList<string[]>, так что легко для последующего использования (каждая строка преобразовать в один объект, и есть много таких csv файлы для различных типов). Код в нижеследующем:

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(); 

Пожалуйста, помогите с комментариями. Я хочу обрезать каждое слово, чтобы впоследствии их можно было преобразовать в целые числа. Но это не будет компилировать (я знаю, что причина может быть, что Linq лечит ж, как IEnumable<Char>, но как я могу достичь своей цели только один Linq заявление?

+0

Кстати, вы заботитесь о линии вообще, или вы просто хотите массив со словами после того, как все? – Evk

+0

одна строка - это один объект, а слова линий не должны смешиваться. –

ответ

1

В вашей первой попытки у Вас есть ошибка в

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

так ', ' не может быть один символ. Вы хотите что-то вроде этого

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(); 

Изменить: сокращенный вариант предложенный EVK (см свой комментарий ниже)

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

Вы можете обрезать их сразу после Split (Split()). Выберите(). ToArray()) сохранит один оператор Select. – Evk

+0

@ Evk: Ты прав; Понимаю. Но так как вопрос о 'Trim' и есть * ошибка * в исходном' Split', я решил иметь * два * 'Select', чтобы не было слишком сложным Linq *. –

+1

@DmitryBychenko thx, я пробую ваше решение. но задаваясь вопросом, как вы говорите «не слишком сложно», вы имеете в виду, что есть сложный способ ** (просто любопытно)? –

Смежные вопросы