2013-06-07 2 views
2

I TEXTFILE에서 줄 바꿈과 함께 다음과 같은 문자열이 있습니다. 여기는 C#으로 다차원 배열로 텍스트 데이터를 변환 :

Card No.  Seq  Account 1 Account 2 Account 3 Account 4 Customer Name   Expiry Status 

0100000184998 1 2500855884500     -   -  /NIRMAL PRADHAN   1302  Cold 
0100000186936 1      -   -   -  /RITA SHRESTHA   1302  Cold 
0100000238562 1 2500211214500     -   -  /HARRY SHARMA   1301  Cold 
0100000270755 0 1820823730100  -   -     /EXPRESS ACCOUNT   9999  Cold 
0100000272629 0 1820833290100  -   -   -  /ROMA MAHARJAN   1208  Cold 
0100000272637 0 2510171014500  -      -  /NITIN KUMAR SHRESTHA 1208  Cold 
0100000272645 0 1800505550100  -   -   -  /DR HARI BHATTA   1208  Cold 

,

  • Card No, Seq 고정했다 자리를.
  • Account 1, Account 2, Account 3, Account 4fixed digit number 또는 - 또는 null 일 수 있습니다.
  • 고객 이름이 First Name, Last Name, Middle Name

내 원하는 결과가있을 수 있습니다 : 여기

array[0][0] = "0100000184998" 
array[0][1] = "1" 
array[0][2] = "2500855884500" 
array[0][3] = " " 
array[0][4] = "-" 
array[0][6] = "NIRMAL PRADHAN " 

array[1][0] = "0100000186936" 
array[1][1] = "1" 
array[1][3] = " " 
array[1][4] = "-" 

, 내가 시도하는 것입니다 :

var sourceFile = txtProcessingFile.Text; 
string contents = System.IO.File.ReadAllText(sourceFile); 
    var newarr = contents.Split(new char[]{ '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) 
    .Select (x => 
     x.Split(new char[]{ ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray() 
    ).ToArray(); 


DataTable dt = new DataTable("NewDataTable"); 


dt.Columns.Add("CardNo"); 
dt.Columns.Add("SNo"); 
dt.Columns.Add("Account1"); 
and so on... 

for (int row = 0; row < newarr.Length; row++) 
{ 

    for (int col = 0; col < newarr[col].Length; col++) 
    { 
     dt.Rows.Add(newarr[row]); 
     row++; 

    } 


} 

이 경우 잘 작동 데이터 필드는 비어 있지 않으며 고객 이름은 첫 번째 이름이거나 구분됩니다.

는하지만, 여기에 내가 무엇을 얻기 위해 시도하고 있습니다 :

  • First Name, Middle Name 또는 Last Name이 같은 배열 요소에 저장해야합니다.
  • Account Number은 공백으로 남겨 두어야합니다.

    어떻게 데이터 테이블에 올바르게 저장할 수 있습니까?

    당신이 계정 값 -null 값 사이의 차이를 제작하지 않는 타협을하고자하는 경우
+0

'만기'와'상태'는 항상 비어 있지 않은 값을 가질 것입니까? –

+0

예 ..(그러나 계정 번호로 구현할 수 있다면 내 가정은 만료 및 상태에 문제가되지 않을 것입니다.) –

+0

** 1 ** 파일에서 데이터 엔터티를 분리하기 위해 공간 만 사용하고 있으므로 다음을 사용하십시오. 이름과 성을 저장하는 특수 문자. 예. 해리 샤 르마. 읽을 때 을 삭제할 수 있습니다. ** 2 ** ** 공백 문자를 지정하는 것과 같은 방법으로 특수 기호를 사용하십시오. 계정 번호가 no이면 을 사용하십시오. 공백이며 파일 읽기 작업 중 제거하십시오. – ikis

답변

0

, 당신이 시도 할 수 있습니다 :

var sourceFile = txtProcessingFile.Text; 
string[] contents = System.IO.File.ReadAllLines(sourceFile); 
DataTable dt = new DataTable("NewDataTable"); 

dt.Columns.Add("CardNo"); 
dt.Columns.Add("SNo"); 
dt.Columns.Add("Account1"); 
dt.Columns.Add("Account2"); 
dt.Columns.Add("Account3"); 
dt.Columns.Add("Account4"); 
dt.Columns.Add("CustomerName"); 
dt.Columns.Add("Expiry"); 
dt.Columns.Add("Status"); 

for (int row = 2; row < contents.Length; row++) 
{ 
    var newRow = dt.NewRow(); 
    var regEx = new Regex(@"([\w]*)"); 
    var matches = regEx.Matches(contents[row].ToString()) 
     .Cast<Match>() 
     .Where(m => !String.IsNullOrEmpty(m.Value)) 
     .ToList(); 
    var numbers = matches.Where(m => Regex.IsMatch(m.Value, @"^\d+$")).ToList(); 
    var names = matches.Where(m => !Regex.IsMatch(m.Value, @"^\d+$")).ToList(); 
    for (int i = 0; i < numbers.Count() - 1; i++) 
    { 
     newRow[i] = numbers.Skip(i).First(); 
    } 
    newRow[newRow.ItemArray.Length - 2] = numbers.Last(); 
    newRow[newRow.ItemArray.Length - 1] = names.Last(); 
    newRow[newRow.ItemArray.Length - 3] = names.Take(names.Count() - 1).Aggregate<Match, string>("", (a, b) => a += " " + b.Value); 
    dt.Rows.Add(newRow); 
} 
0

가 단일로 이름을 해결하기 위해 이것은 여전히 ​​열 헥타르로 문제가 해결되지 않습니다

x.Split(new string[]{ " " } 

: 그 공간은, 대신 하나의 공간의 이중 공간 분할을 시도 할 수 가치가 없습니다. 텍스트 파일의 모든 부분이 특정 위치에있는 것 같습니다. 당신의 라인이 newarr에 저장되면 Seq는 각 열의 값을 얻기 위해 .Trim()으로 String.Substring()를 사용하려면 단지 수 Account 1

위치 (20)에 위치 (16)에있다.

1

TextFieldParser 클래스를 사용하는 것이 좋습니다. 예, Microsoft.VisualBasic 네임 스페이스에 있지만 C#에서 사용할 수 있습니다. 이 클래스를 사용하면 필드 너비가 고정 된 텍스트 파일을 쉽게 파싱 할 수 있습니다. 예를 들어 How to: Read From Fixed-width Text Files in Visual Basic 문서를 참조하십시오. 다시 샘플은 Visual Basic에 있지만 C#으로 변환하는 것은 매우 쉽습니다.

관련 문제