我正在尝试从引号过滤 csv文件。这一行奇怪地删除了该行中的所有引号:
之前:"NewClient"Name"
foo = foo.Replace(foo.Substring(0, 1), "");
之后:NewClientName
为什么会这样?不应该Replace()
方法只删除第一次出现?
答案 0 :(得分:2)
通常在使用CSV时,我们双引用:
a -> "a"
a"b -> "a""b"
NewClient"Name -> "NewClient""Name"
削减这样的报价,即
"NewClient""Name" -> NewClient"Name
当"NewClient"Name"
是语法错误时,您可以尝试
private static string CutQuotation(string value) {
if (string.IsNullOrEmpty(value))
return value;
else if (!value.Contains('"'))
return value;
if (value.Length == 1)
throw new FormatException("Incorrect quotation format: string can't be of length 1.");
else if (value[0] != '"')
throw new FormatException("Incorrect quotation format: string must start with \".");
else if (value[value.Length - 1] != '"')
throw new FormatException("Incorrect quotation format: string must end with \".");
StringBuilder builder = new StringBuilder(value.Length);
for (int i = 1; i < value.Length - 1; ++i)
if (value[i] == '"')
if (i == value.Length - 2)
throw new FormatException("Incorrect quotation format. Dangling \".");
else if (value[++i] == '"')
builder.Append(value[i]);
else
throw new FormatException("Incorrect quotation format. Dangling \".");
else
builder.Append(value[i]);
return builder.ToString();
}
正如您所看到的,这不仅仅是单Replace()
例程。
试验:
// abc - no quotation
Console.WriteLine(CutQuotation("abc"));
// abc - simple quotation cut
Console.WriteLine(CutQuotation("\"abc\""));
// "abc" - double quotation
Console.WriteLine(CutQuotation("\"\"abc\"\""));
// a"bc - quotation in the middle
Console.WriteLine(CutQuotation("\"a\"\"bc\""));
答案 1 :(得分:1)
不应该替换方法只删除第一次出现吗?
您会这么认为,因为您正在使用public class First{
public static bool FirstBool {get; set;}
public static string aString {get; set;}
}
public class Second{
public static bool AnotherBool {get; set;}
public static string aString {get; set;}
}
public class Third{
public static bool ThirdBool {get; set;}
public static string aString {get; set;}
public static string AdditionalString {get; set;}
}
:
Substring(0, 1)
但是在调用string foo = "\"NewClient\"Name\"";
foo = foo.Replace(foo.Substring(0, 1), "");
之前获得子字符串。换句话说,您的Replace()
和Substring()
彼此无关,因此代码相当于:
Replace()
String.Replace()
取代所有出现次数。
如果您只想替换第一个实例,请参阅How do I replace the *first instance* of a string in .NET?。如果您只是想要删除第一个字符,请参阅Fastest way to remove first char in a string。如果要从字符串的开头删除特定字符,请参阅C# TrimStart with string parameter。
答案 2 :(得分:0)
不,替换方法替换字符串中char的所有活动(参见https://msdn.microsoft.com/en-us/library/fk49wtc1(v=vs.110).aspx)。
如果你只需要删除第一个/最后一个字符(如果有的话),你可以使用修剪功能: https://msdn.microsoft.com/en-us/library/d4tt83f9(v=vs.110).aspx
在你的情况下:
result[i, 0] = result[i, 0].Trim('"')
答案 3 :(得分:0)
您的要求适用于此。
string strTest = "\"NewClient\"Name\"";
strTest = strTest.TrimStart('"');
在你的情况下它是
result[i, 0] = result[i, 0].TrimStart('"');
* Replace将删除并替换给定实例中所有匹配的char / string。