簡體   English   中英

當數組的成員可能包含多個單詞時,如何拆分C#字符串?

[英]How can I split a C# string when a member of the array may consist of more than one word?

我正在做一個小項目,要獲取一個CSV文件,然后將其數據插入到HTML表中(我將使用datagrid和dataset或datatable,但是我要與之交談的系統不支持ASP.NET上傳來發送新聞通訊) 。

無論如何,我將使用file.readalllines方法將csv文件的內容返回到字符串數組中。

但是對於數組的每個字符串成員,我將使用string.split函數將字符串拆分為char數組。 問題是(csv文件是由我與btw交談的系統生成的-我從該系統獲取數據並將數據輸入到其中),csv內容是汽車制造的。 這意味着我可以擁有:

日產Almera

日產Almera 1.4 TDi

大眾高爾夫1.9 SE

依此類推...

是否有一種可靠的方法可以確保我擁有Almera 1.4 TDi,例如,它是char數組中的一個成員,因此我將每個字符串拆分為該成員,而不是單獨的成員。

使用string.Split()的重載版本來限制返回值的數量。

    string makeModel = csvArray[0]; // or whichever column it is in
    string[] makeAndModel = makeModel.Split( new char[] { ' ' } , 2 );
    string make = makeAndModel[0];
    string model = makeAndModel[1];

對於汽車,我有點不滿意,但是您能不能指定主要品牌作為分隔符,而不是空格?

EG:Nissan Almera Nissan _X100_Ultra_Model Ford Prefect Toyota Foo Bar Honda Prius

解析主要品牌(日產,福特,豐田,本田)將生產:

  • 日產Almera
  • 日產_X100_Ultra_Model
  • 福特長官
  • 豐田Foo酒吧
  • 本田普銳斯

您將需要使用正則表達式。

我不確定您是否需要使用正則表達式,但是可以用一個解決問題,然后遇到2個問題。

5秒鍾的Google搜索regex csv產生了一個博客條目

,(?=([^"]*"[^"]*")*(?![^"]*"))

雖然一開始看起來很不錯,但此正則表達式雖然不匹配逗號的內部字符串,但匹配了逗號的位置。 因此,您認為將其轉變為有用的東西或至少為您提供一個起點是非常瑣碎的。

提醒您,如果輸入類似

 123,456,"Unbalanced quote 

與逗號不匹配的地方。


步驟2,另一個Google搜索,這次用於c# split csv files

C#中的CSV文件解析器和寫入器(第3部分) (但請檢出第1和2部分的代碼)

它看起來更加健壯,甚至具有測試用例。

由於沒有標准的CSV格式,因此對於允許的輸入文件,您必須要判斷它是否可行。

據我了解的問題:

  • 所解析文件中的行不是CSV,它們以空格分隔。
  • 每行(制造商/型號)的第一字段的值可能包含0個或更多實際空格。
  • 每行中其他字段的值不包含空格,因此使用空格定界符即可正常工作。

假設您有四列,第一列的值應該是“ Nissan Almera 1.4 TDi”。 使用普通的Split()會導致7個字段而不是4個字段。

(未經測試的代碼)

首先,將其拆分:

int numFields = 4;
string[] myFields = myLine.Split(' ');

然后,修復數組:

int extraSpaces = myFields.length-numFields;
if(extraSpaces>0) {
  // Piece together element 0 in the array by adding the extra elements
  for(int n = 1; n <= extraSpaces; n++) {
    myFields[0] += ' ' + myFields[n];
  }
  // Move the other values back to elements 1, 2, and 3 of the array
  for(int n = 1; n < numFields; n++) {
    myFields[n] = myFields[n + extraSpaces];
    }
  }

最后,忽略數組中您實際要解析的所有元素。

另一種方法是正則表達式。 我認為這樣會起作用:

 MatchCollection m = RegEx.Matches(myLine, "^(.*) ([^ ]+) ([^ ]+) ([^ ]+)$");
 string MakeModel = m.Groups[1].Captures[0].ToString();
 string ModelYear = m.Groups[2].Captures[0].ToString();     
 string Price     = m.Groups[3].Captures[0].ToString();     
 string NumWheels = m.Groups[4].Captures[0].ToString();

這里沒有分割或數組,只有RegEx捕獲的組。

如果有一個內置的String.Reverse()方法(沒有),我可能建議使用VB.NET的Replace()函數和Count參數來替換反向的前三個空格(假設四個字段)之后的所有空格。原始字符串,然后再次將其反轉並拆分。 就像是:

string[] myFields = Microsoft.VisualBasic.Replace(myLine.Reverse(), " ", "_", 0, 3).Reverse().Split(' ');
myFields[0] = myFields[0].Replace("_", " "); //fix the underscores

正如其他人指出的那樣,string.split()需要一個參數,因此您可以傳遞一個','來基於該參數進行拆分。 值中是否有空格並不重要。 但是,除非您真的確定沒有任何包含逗號的值,否則我不建議這樣做。 打包CSV文件比最初看起來要復雜一些(處理引號和包含逗號的值),我建議為此使用一些現有的庫,例如http://www.codeproject.com/KB/database/CsvReader.aspx

Split()方法采用一個char參數,該參數可用於指定定界符。 因此,您可以執行以下操作:

String.Split(Convert.ToChar(","));

根據您的問題判斷,所有汽車制造商都應以逗號分隔,這樣才能正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM