我目前正在从CSV文件中解析值并将它们添加到数据表中。
csv文件包含5列,在将每行添加到数据表之前解析每一行。
解析csv后,数据表可以显示如下:
| Town/City | Cost |
| Birmingham | 400 |
| Manchester | 500 |
对于这些数据,没有问题。但是,我有一些如下所示的值:
| Town/City | Cost |
| London, West | 800 |
由于一列的值之间有逗号,因此显然将其解析为单独的列。
数据无法更改,因此我需要一种方法将其解析为单列而不是两列。
到目前为止,这是我的代码,用于解析有5列的行。我已经评论了我想新代码需要去的地方。
//parse csv file and return as data table
public System.Data.DataTable GetCsvData()
{
string strLine;
char[] charArray = new char[] { ',' };
List<string> strList = new List<string>();
System.Data.DataTable dt = new System.Data.DataTable("csvData");
System.IO.FileStream fileStream = null;
System.IO.StreamReader streamReader = null;
if (!string.IsNullOrEmpty(csvFilePath))
{
fileStream = new System.IO.FileStream(csvFilePath, System.IO.FileMode.Open);
streamReader = new System.IO.StreamReader(fileStream);
strLine = streamReader.ReadLine();
strList = strLine.Split(charArray).ToList();
//only add first 5 columns
for (int i = 0; i <= 4; i++)
dt.Columns.Add(strList[i].Trim());
strLine = streamReader.ReadLine();
while (strLine != null)
{
strList = strLine.Split(charArray).ToList();
System.Data.DataRow dataRow = dt.NewRow();
/*THIS CODE PARSES THE ROW'S 5 COLUMNS AND NEEDS TO PARSE COMMA
SEPERATED VALUES AS A SINGLE VALUE*/
for (int i = 0; i <= 4; i++)
dataRow[i] = strList[i].Trim();
dt.Rows.Add(dataRow);
strLine = streamReader.ReadLine();
}
streamReader.Close();
return dt;
}
return null;
}
任何对此的帮助都会非常感激,因为我正努力在谷歌上找到答案。
答案 0 :(得分:1)
我建议在拆分后检查数组。如果您发现它有N + 1列(您希望N在哪里),请合并两个City列并将其他列向下移动(strList [i] = strList [i + 1])。否则正常处理。
当然,这仅适用于只有一个具有潜在逗号的列。
答案 1 :(得分:1)
除了检查@Bahri建议的拆分数组的长度外,如果您的数据足够可预测(如您的示例所示),则可以检查列内容。
如果示例中的成本始终是一个数字,您可以检查它是否只包含数字(或使用正则表达式进行更复杂的匹配)。如果没有,则折叠前两列。