正如標題所暗示的那樣,我正在尋找有關如何將字串(csvData)轉換為二維字串陣列的指導,方法是將其分別拆分';'兩次','。目前,我正處于能夠將其拆分為行并將其轉換為陣列的階段,但我無法弄清楚如何創建一個二維陣列,其中除以的列','也是分開的。
string[] Sep = csvData.Split(';').Select(csvData => csvData.Replace(" ","")).Where(csvData => !string.IsNullOrEmpty(csvData)).ToArray();
我嘗試了各種方法,例如:
string[,] Sep = csvData.Split(';',',').Select(csvData => csvData.Replace(" ","")).Where(csvData => !string.IsNullOrEmpty(csvData)).ToArray();
天真地認為 c# 會理解我試圖實作的目標,但是由于我在這里,很明顯我得到了“無法將型別隱式轉換string[]為string [*,*]”的錯誤
請注意,我已經有一段時間沒有編碼了,所以如果我的想法完全錯誤,并且您不明白我想用這個問題表達什么,我提前道歉。謝謝!
uj5u.com熱心網友回復:
在像 C# 這樣的強型別語言中,編譯器不會假設您打算如何處理資料。您必須通過代碼明確表達您的意圖。像這樣的東西應該作業:
string csvData = "A,B;C,D";
string[][] sep = csvData.Split(';') // Returns string[] {"A,B","C,D"}
.Select(str => str.Split(',')) // Returns IEnumerable<string[]> {{"A","B"},{"C","D"}}
.ToArray(); // Returns string[][] {{"A","B"},{"C","D"}}
uj5u.com熱心網友回復:
行用分號隔開,列用逗號隔開?
用';'分割 給你一個行陣列。用 ',' 分割一行會給你一個值陣列。
如果您的資料具有一致的架構,因為在您處理的每個 csv 中都有相同的列,您可以定義一個類來表示物體,以使資料更易于使用。
假設它是客戶資料:
John,Smith,8675309,[email protected];
您可以使用這些屬性創建一個類:
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
}
然后:
var rows = csvdata.Split(';');
List<Customer> customers = new();
foreach(var row in rows)
{
var customer = row.Split(',');
customers.Add(new()
{
FirstName = row[0],
LastName = row[1],
Phone = row[2],
Email = row[3]
});
}
現在,您有一個客戶串列,可以對客戶做任何事情。
uj5u.com熱心網友回復:
這是一個回答,展示了您可以使用 C# 做的一些替代想法和事情 - 更多的是用于教育/學術目的而不是其他任何事情。這些天來使用 CSV,我們會使用 CSV 庫
如果您的資料肯定是定期形成的,那么您只需一次拆分就可以逃脫。以下代碼在任一字符上拆分為一個長陣列。那么按理說每4個元素就是一個新客戶,客戶的資料由n 0、n 1、n 2和n 3給出。因為我們知道我們將消耗多少資料項,所以將其除以 4 就可以得出客戶數量,因此我們可以預先確定 2D 陣列的大小
var bits = data.Split(';',',');
var twoD = new string[bits.Length/4,4];
for(int x = 0; x < bits.Length; x =4){
twoD[x/4,0] = bits[x 0];
twoD[x/4,1] = bits[x 1];
twoD[x/4,2] = bits[x 2];
twoD[x/4,3] = bits[x 3];
}
我不認為我會使用 2D 陣列 - 我推薦另一個答案,建議創建一個類來保存相關資料;你可以使用同樣的技術
var custs = new List<Customer>();
for(int x = 0; x < bits.Length;){
custs.Add(new()
{
FirstName = bits[x ],
LastName = bits[x ],
Phone = bits[x ],
Email = bits[x ]
});
}
這里我們沒有在回圈頭中增加 x ;每次分配一點資訊x時,回圈體中都會增加 1。我們本可以保持與以前相同的方法,將其跳躍 4 - 只是演示另一種適合這里的方法。
我提到這些天我們可能不會真正手動讀取 csv 并拆分自己 - 如果資料包含逗號或分號 - 它會破壞檔案結構
有大量的庫可以讀取 CSV 檔案,CsvHelper 是一個流行的庫,你可以像這樣使用它:
using var reader = new StreamReader("path\\to\\file.csv");
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture)
var custs = csv.GetRecords<Customer>().ToList();
...
您的檔案將有一個標題行,其中的列名稱與您在 c# 中的屬性名稱相匹配。如果沒有,那么您可以使用屬性上的屬性來告訴 CsvH 應該將哪些列映射到哪些屬性 - https://joshclose.github.io/CsvHelper/getting-started/
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427481.html
下一篇:按一列排序行,然后按IP地址列
