我正在嘗試從 excel 電子表格中讀取資料并將其放入 csv 檔案中。我正在使用 ToCSV() 擴展(https://extensionmethod.net/csharp/list-string/datareader-to-csv)。為了洗掉任何換行符,我添加了洗掉“\n”以洗掉所有額外的換行符,但這僅解決了 90% 資料的問題。還有什么我應該從原始字串中洗掉以確保沒有多余的行嗎?
public static List<string> ToCSV(this IDataReader dataReader, bool includeHeaderAsFirstRow, string separator)
{
List<string> csvRows = new List<string>();
StringBuilder sb = null;
if (includeHeaderAsFirstRow)
{
sb = new StringBuilder();
for (int index = 0; index < dataReader.FieldCount; index )
{
if (dataReader.GetName(index) != null)
sb.Append(dataReader.GetName(index));
if (index < dataReader.FieldCount - 1)
sb.Append(separator);
}
csvRows.Add(sb.ToString());
}
while (dataReader.Read())
{
sb = new StringBuilder();
for (int index = 0; index < dataReader.FieldCount - 1; index )
{
if (!dataReader.IsDBNull(index))
{
string value = dataReader.GetValue(index).ToString();
if (dataReader.GetFieldType(index) == typeof(String))
{
//if newline character is used in value, ensure each are replaced.
if (value.IndexOf("\n") >= 0)
value = value.Replace("\n", "");
//If double quotes are used in value, ensure each are replaced but 2.
if (value.IndexOf("\"") >= 0)
value = value.Replace("\"", "\"\"");
//If separtor are is in value, ensure it is put in double quotes.
if (value.IndexOf(separator) >= 0)
value = "\"" value "\"";
if (value.IndexOf("CR LF") >= 0)
value = value.Replace("CR LF", "");
if (value.IndexOf("LF") >= 0)
value = value.Replace("LF", "");
}
sb.Append(value);
}
if (index < dataReader.FieldCount - 1)
sb.Append(separator);
}
if (!dataReader.IsDBNull(dataReader.FieldCount - 1))
sb.Append(dataReader.GetValue(dataReader.FieldCount - 1).ToString().Replace(separator, " "));
csvRows.Add(sb.ToString());
}
dataReader.Close();
sb = null;
return csvRows;
}
}
uj5u.com熱心網友回復:
用空字串替換 \r 和 \n 將負責消除換行符。但是,我看到您已將“CR LF”和“LF”替換為空字串。這實際上會替換任何帶有“LF”或“CR LF”的文本,而不是特殊字符(回車和換行)。
uj5u.com熱心網友回復:
正如 LearnerMantis 所說,您正在替換實際的“CR”和“LF”字串,而不是特殊字符。
如果您的程式正在讀取來自同一環境的檔案,則可以使用該System.Environment.NewLine常量。
回圈的內部代碼將變為:
string value = dataReader.GetValue(index).ToString();
if (dataReader.GetFieldType(index) == typeof(String))
{
value = value.Replace(System.Environment.NewLine, "");
}
sb.Append(value);
如果要管理來自不同環境的檔案,則可以Replace直接使用該功能,如下所示:
string replaceWith = "";
string value = dataReader.GetValue(index).ToString();
if (dataReader.GetFieldType(index) == typeof(String))
{
value = value.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}
sb.Append(value);
如果您愿意,也可以使用Regex.Replace:
value = Regex.Replace(value, @"\r\n?|\n", "");
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484694.html
