我有一組從第 3 方資料源收到的每日 CSV 檔案,其中的欄位沒有雙引號,除非它們包含逗號,但是有人認為有時在欄位中包含雙引號是個好主意。
該檔案有時包含這樣的記錄,但在第一行批量插入 SQL Server 失敗:
4458,123456,Danny "LEE" Smith,123456789122,Pizza Inc
4458,789012,John Baker,987654321,"Company Name, LLC"
我需要以編程方式將檔案更新為這樣的內容,以便 SQL Server 的批量插入不會因第 2 行的雙引號剩余而失敗:
4458,123456,Danny 'LEE' Smith,123456789122,Pizza Inc
4458,789012,John Baker,987654321,"Company Name, LLC"
是否有一種編程方式說正則運算式來對整個檔案進行更改,還是我只需要遍歷每一行以查找沒有逗號前后的雙引號?
uj5u.com熱心網友回復:
我用這個網站https://regex101.com/
測驗正則運算式
對于這個檔案:
4458,123456,Danny "LEE" Smith,123456789122,Pizza Inc
4458,789012,John Baker,987654321,"Company Name, LLC"
4458,789012,"John,Baker",987654321,Company Name LLC
使用這個正則運算式:
[^,](")[^[$|,|\n]
我設法挑選出周圍的報價"LEE"
因此,您可以使用任何正則運算式工具來查找和替換它們。
既然你提到了 C#,這是我從這里改編的代碼示例https://www.c-sharpcorner.com/article/c-sharp-regex-examples/
string badString = "<your CSV file>" ;
string regex = "[^,](\")[^[$|,|\n]";
string CleanedString = Regex.ReplaceGroupValue(badString, regex ,1,"'");
我還必須在 C# 中查找轉義字串。這是未經測驗的,但試一試。
uj5u.com熱心網友回復:
也許是這樣的:
private static void NormalizeCsv(string inputFile, string outputFile, Encoding encoding) {
IEnumerable<string> inputLines = File.ReadLines(inputFile, encoding);
using TextWriter outputLines = new StreamWriter(outputFile, append: false, encoding);
outputLines.NewLine = "\r\n";
foreach (string line in inputLines) {
if (line.IndexOf('"') < 0) {
outputLines.WriteLine(line);
} else {
string[] tokens = line.Split('"', Int32.MaxValue, StringSplitOptions.None);
for (int i = 0; i < tokens.Length; i ) {
string token = tokens[i];
if ((i % 2) == 0) {
outputLines.Write(token);
} else {
if (token.IndexOf(',') > -1) {
outputLines.Write("\"");
outputLines.Write(token);
outputLines.Write("\"");
} else {
outputLines.Write("'");
outputLines.Write(token);
outputLines.Write("'");
}
}
}
outputLines.WriteLine();
}
}
}
uj5u.com熱心網友回復:
感謝大家的幫助。我認為在我給出了正則運算式解決方案的各種問題的時間范圍內,我需要的最快解決方案是逐行讀取檔案,如果我發現雙引號前面沒有逗號或后面沒有逗號,然后我將用單引號替換它,將該行寫入一個新檔案,然后繼續瀏覽該檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452425.html
上一篇:SQLCount列剩余為1
