2012-10-05 16 views
8

Widziałem tutaj kilka pytań związanych z usuwaniem podwójnych cudzysłowów. Ale to nie rozwiązało mojego problemu. Powiedzieli, aby użyć funkcji Zamień lub Przytnij. Użyłem, ale problem pozostaje.Chcesz usunąć podwójne cudzysłowy ze stringów

Mój kod:

DataTable dt = TypeConveriontHelper.ConvretExcelToDataTable(SourceAppFilePath); 
     string targetPath = BatchFolderPath + @"\" + "TRANSACT.INX"; 
     StreamWriter wrtr = null; 
     wrtr = new StreamWriter(targetPath); 
     for (int x = 0; x < dt.Rows.Count; x++) 
     { 
      string rowString = ""; 
      for (int y = 0; y < dt.Columns.Count; y++) 
      { 
       if (y == dt.Columns.Count - 1) 
       { 
        rowString += "\"" + dt.Rows[x][y].ToString() + "\""; 
       } 
       else 
       { 
        rowString += "\"" + dt.Rows[x][y].ToString() + "\"~"; 
       } 
      }   
      rowString.Replace('"', ' ').Trim(); 
      wrtr.WriteLine(rowString); 
     } 
     wrtr.Close(); 
     wrtr.Dispose(); 

Próbowałem za pomocą rowString.Replace('"', ' ').Trim(); w powyższym kodzie. Ale podwójne cytaty są obecne w obecnej postaci. Udowodnij mi rozwiązanie. Dzięki.

+0

Podejrzewam, że jeśli przeczytasz odpowiedzi w pozostałych pytaniach * ostrożnie *, otrzymasz odpowiedź ... Pamiętaj, że powinieneś także używać instrukcji 'using' w celu dysponowania zasobami, nawet jeśli istnieje wyjątek. –

Odpowiedz

22

Musisz przypisać go do rowString:

rowString = rowString.Replace('"', ' ').Trim(); 

Stringsimmutable.

row.String.Replace(...) zwróci ci ciąg, ponieważ nie przypisujesz mu niczego, co zostanie odrzucone. Nie zmieni oryginalnego obiektu rowString.

Możesz użyć String.Empty lub "", aby zamienić podwójne cudzysłowy na pusty ciąg, zamiast pojedynczego odstępu ' '. Więc stwierdzenie powinno być:

rowString = rowString.Replace("\"", string.Empty).Trim(); 

(Pamiętaj, aby przejść podwójny cudzysłów jako ciąg"\"", ponieważ przeciążenie metoda z string.Empty wymagać będzie zarówno parametry, aby być typu string).

Możesz pozbyć się Trim() na końcu, jeśli próbujesz usunąć spacje dodając podczas string.Replace na początku lub końcu ciągu.

+3

Ta odpowiedź byłaby lepsza, gdybyś wyjaśniła, * dlaczego * ... –

+0

@JonSkeet, miałem zamiar :), teraz zmodyfikowany – Habib

+0

@Habib, działa dobrze, ale jak usunąć spacje. Proszę pomóż. Dzięki. –

0

Ten wiersz zawiera błąd.

rowString.Replace('"', ' ').Trim(); 

Ponieważ zarówno replace, jak i trim zwraca ciąg znaków, należy przypisać go do zmiennej. Nie przypisując napisu utracisz wartość wygenerowaną przez metody zamiany i przycięcia.

var myString = rowString.Replace('"', ' ').Trim(); 
//Or 
rowString = rowString.Replace('"', ' ').Trim(); 
0

W VB musisz spróbować tego:

Replace("""", ""); 

Ale w C# trzeba spróbować:

Replace("\"", ""); 
+1

Nie dlatego podwójne cytaty nadal istnieją, ale ... –

0

rowString.Replace('"', ' ') tworzy nowy obiekt string i nie modyfikować istniejący obiekt string .so musisz przypisać nowo utworzony obiekt typu string do innej zmiennej lub zastąpić istniejącą zmienną.

0

Jak wspomniał Habib, Ciągi są niezmienne. Wszelkie manipulacje ciągami muszą zostać cofnięte za pomocą zmanipulowanych danych, takich jak Zastąp, Odwróć itp.

Spróbuj więc przypisać zastąpiony ciąg, aby uzyskać pożądane zachowanie.

0

Twój problem jest częstym błędem. Oto co trzeba zrobić:

rowString = rowString.Replace('"', ' ').Trim(); 

Należy zwrócić wynik do zmiennej (rowString =). Jeśli tego nie zrobisz, C# będzie nadal uruchamiał metody, ale nie zmodyfikuje zmiennej. Jest tak w przypadku każdego modelu immutable objects.

przykład:

rowString.Replace('"', ' ').Trim(); 

będzie nie modyfikowania rzeczywistego rowString obiektu.

rowString = rowString.Replace('"', ' ').Trim(); 

zastępuje starą wartość rowString z wyniku kodu po prawej stronie.

Napisałem tę odpowiedź i właśnie zdałem sobie sprawę, że Habib wyjaśnił dokładnie to samo powyżej. :)

Powiązane problemy