2014-07-07 2 views
0

while 루프에서 CSV 파일을 만들었습니다. 궁극적으로 GroupBy 정보가있는 다른 CSV 파일을 생성하려면 내 코드가 필요합니다. LINQ Groupby C# from CSV

while (code) 
{ 
    output3 = split[5].Replace(',', ' ') + ',' + 
     split[0].Substring(0, 2) + "-" + 
     split[0].Substring(2, 4) + ',' + 
     split[4] + ",," + sentprice + ',' + 
     split[3] + ',' + 
     split[2] + ',' + calccharge + ',' + 
     split[1] + ",,," + "NA" + ',' + "A" + ',' + 
     split[0].Substring(6, 5) + Environment.NewLine + output3; 
} 

가 지금은 내가 열 중 하나 (즉, split[1])으로 그룹을 수 output3을 분할하기 위해 노력하고있어 :

그것은 다음과 같이 보입니다.

이 나는 ​​시도했다 :

var table = File.ReadAllLines(FilePath) 
    .Select(record => record.Split(',')) 
    .Select(cell => new { AFPCode = cell[1] }) 
    .GroupBy(x => x.AFPCode); 

하지만 결과는 인덱스가 배열의 범위를 벗어난 저를 제공합니다. 보시다시피 인덱스는 배열의 경계 안에 있습니다. 나는 또한 시도했다

:

도 작동하지 않습니다
IEnumerable<string> table = 
    from row in File.ReadAllLines(FilePath) 
    let elements = row.Split(',') 
    let cell = new {AFPCode = elements[1]} 
    group p by p.AFPcode into g 

. 어떤 도움을 많이 주시면 감사하겠습니다.

+3

색인이 배열의 경계 내에 있음을 알 수 있습니다. 당신의 의견이 무엇인지 모릅니다. –

답변

0

파일 끝에 빈 줄이 있습니다. 빈 줄에는 필드로 분할 할 때 두 번째 항목이 없습니다. 마지막에 빈 줄을 제거하거나 파일에서 읽는 데 사용중인 코드의 빈 줄을 필터링하십시오.

일부 참고 사항 : + 연산자를 사용하여 큰 파일을 구성하지 않아야 루프에서 문자열을 서로 연결할 수 있습니다. 특히 비효율적 인 작업입니다. string.Join을 사용하면 여러 문자열 (행의 모든 ​​필드 또는 파일의 모든 행)을 효율적으로 조인 할 수 있습니다.

다른 옵션은 파일을 계산할 때 각 행을 파일에 기록하는 것입니다 (실제로는 메모리에 둘 이상의 행이 없으므로 실제로 더 좋습니다). 일련의 모든 부분이있는 경우에는 File.WriteAllLines을 사용하면 쉽게 처리 할 수 ​​있습니다.

+0

조언 주셔서 감사합니다! – user3813607

1

일부 행에 두 번째 열이 없습니다. 아래 행을 필터링하려고 했습니까?

var table = File.ReadAllLines(FilePath) 
    .Select(record => record.Split(',')) 
    .Where(cell => cell.Length >= 2) // Add filter clause here 
    .Select(cell => new { AFPCode = cell[1] }) 
    .GroupBy(x => x.AFPCode);