2010-08-23 7 views
1

좋아요. 필자의 CSV 작성기를 근본적으로 작동 시켰습니다. 그것에는 3 개의 란이있다. 이름, 위치, 날짜. 불행히도 현재 수출에는 4 개의 열이 있습니다. 성, 이름, 직책, 날짜. 그 이유는 내가 데이터베이스에서 나가는 데이터가 Last, First가되기 때문입니다. 이 분리 문자를 쉽게 변경할 수 있습니까? 이것은 매우 편리 할거야, 하하.CSV 내보내기에서 구분 기호 변경

+1

파일을 직접 만드십니까? – Achilles

+0

줄 단위로 파일을 만듭니다. 그래서 기본적으로 이것은 3 개의 열인 머리글 다음에 짜증납니다. Smith, John | Position | Date 대신 Smith | John | Position | Date를 얻습니다. – Tom

답변

1

내가해야 할 일을했을 것있을 때 항목을 인용 WriteItem의 비트 :. 그런 짓을 이 여러 번, 그리고 최선의 방법은 귀하의 이름을 싸는 것입니다. 이것은 별도로 (일종의) 처리해야한다는 것을 의미합니다.

귀하의 질문에 내가 읽고있는 것을 바탕으로, Name (LName, FName), PositionDate의 세 열이있는 데이터베이스에서 SQL 구문은 다음과 같습니다. SELECT Name, Position, [Date] FROM Table WHERE ... 그리고 어딘가에 데이터 판독기가있을 것입니다.

이러한 전제를 바탕으로, 나는이 작업을 수행 할 것 :

//SQL Connection and SQL Command have been created separately as _conn and _cmd 
using(SqlDataReader _read = _cmd.ExecuteReader()) 
{ 
    string name = ""; 
    string position = ""; 
    string date = ""; 

    while(_read.Read()) //don't really do this, make sure you're checking for nulls and such 
    { 
     name = _read.GetString(0); 
     position = _read.GetString(1); 
     date = _read.GetString(2); 

     AddLineToLines(string.Format("{0}|{1}|{2}", name, position, date)); 
      //AddLineToLines is a call to add to your list of lines so you can 
      // write your file. 
    } 
} 

이것은 당신이 (대신 CSV의) 파이프로 구분 된 파일을 작성하고 쉼표를 탈출하는 것을 방지 할 수 있습니다.

당신이 CSV 있어야하는 경우, 변경 성 및 FIRSTNAME 사이에 쉼표를 탈출 할 마지막 string.Format

string.Format("\"{0}\",{1},{2}", name, position, date) 

.

+0

그래도 "문자를 질식시킬 것입니다. –

0

대부분의 CSV 파서는 데이터의 쉼표를 보정하기 위해 따옴표를 인식합니다.

"Last, First",Admin,2010/01/01 
+0

지금이 작업을 수행하고 있습니다. dataString + = string.Concat (rep.body [x] [y], ","); 기본적으로 그 배열을 통해 가서 데이터를 채 웁니다 ... 나는 단지 내가 따옴표로 묶을 수 있으면 좋겠다! – Tom

+0

@Tom, 그런 식으로 연결하려는 경우 꽤 작아야합니다. 약 5 또는 6 항목 후에는 StringBuilder를 사용하는 것이 확실합니다. StreamWriter 기반 솔루션을 사용하는 경우 문자열을 가져 오기 위해 StringWriter를 전달할 수 있지만 나중에 웹 페이지와 같은 다른 용도로 채택하여 유연성을 극대화합니다. –

+0

@Tom : 바퀴를 재발 명할 필요가 있습니까? 다음은 사용할 수있는 2 가지 작업 샘플입니다. http://knab.ws/blog/index.php?/archives/3-CSV-file-parser-and-writer-in-C-Part-1.html http : //www.stellman-greene.com/CSVReader/ – chilltemp

0

문제는 구분 기호를 변경하지 않고, 그 이후로 상호 운용되지 않습니다 (당신은 당신이 사용하고자하는 자 등이 될 수있는 쉼표로 코드에서 약간 수정 한 것)을.

문제는 올바르게 필드를 벗어나지 못했다는 것입니다.

private void WriteItem<T>(StreamWriter sr, T item) 
{ 
    string itemString = item.ToString(); 
    if(itemString.IndexOfAny('"', ',', '\n', '\r') != -1)//skip test and always escape for different speed/filesize optimisation 
    { 
     sr.Write('"'); 
     sr.Write(itemString.Replace("\"", "\"\"")); 
     sr.Write('"'); 
    } 
    else 
     sr.Write(itemString); 
} 
private void WriteLine<T>(StreamWriter sr, IEnumerable<T> line) 
{ 
    bool first = true; 
    foreach(T item in line) 
    { 
     if(!first) 
      sr.Write(','); 
     first = false; 
     WriteItem(sr, item); 
    } 
} 
private void WriteCSV<T>(StreamWriter sr, IEnumerable<IEnumerable<T>> allLines) 
{ 
    bool first = true; 
    foreach(IEnumerable<T> line in allLines) 
    { 
     if(!first) 
      sr.Write('\n'); 
     first = false; 
     WriteLine(sr, line); 
    } 
} 

하고 ", 또는 처리됩니다 현재 개행"성, 이름 "형식