2017-09-27 30 views
1

执行我的C#代码以读取带有ADO的.CSV我在阅读我的行时遇到下一个问题: ,我得到一个包含在字符串中的值并用“\”分隔。像“hi \ goodMorning \ ByeBye”。如何转义''

这里是我的代码:

// Crear el objeto de conexión utilizando la cadena de conexión anterior. 
using (OleDbConnection objConn = new OleDbConnection(sConnectionString)) 
{ 
    // Abrir la conexión con la base de datos. 
    objConn.Open(); 
    // El código utiliza un comando SQL SELECT para mostrar los datos de la hoja de cálculo. 
    string sql = "SELECT * FROM " + fileName; 
    // Crear un nuevo OleDbCommand para devolver los datos de la hoja de cálculo. 
    using (OleDbCommand objCmdSelect = new OleDbCommand(sql, objConn)) 
    { 
     // Crear un nuevo OleDbDataAdapter que se usa para generar un DataSet // basado en la instrucción SQL SELECT anterior. 
     // Pasar el comando Select al adaptador. 
     //OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(objCmdSelect); 
     OleDbDataReader reader = objCmdSelect.ExecuteReader(); 

     while (reader.Read()) 
     { 
      string value= @reader[0].ToString(); 

我一直在努力,到目前为止做:

A --> string value = reader[0].ToString(); 

B --> value .Split(Convert.ToChar(92)); //Using ASCII 

C --> System.Text.RegularExpressions.Regex.Escape("\\") 

D --> value.Contains((char)92); //---> returns false 

E --> value.Contains("\\\"); //---> returns false 

F --> .Replace doesn't work either 

我出出主意!很高兴听到任何建议。我认为如果我可以逃避角色,问题就会解决。到目前为止,我做不到。如果我得到我的答案,我会发布它。

这 - >@"your\string\here".Contains("\\"); - >返回TRUE - 它不

enter image description here

在我的情况的正确答案是:

string [] temp = @"aaa\taaa\taaa".Split('\t'); 

谢谢大家! :)

+0

value.Contains(“\”)只要其值为(@“\”) – BugFinder

+1

如果“value.Contains(”\\“); --->返回false”,那么您的某个错误你检查的字符串。因为:'@“\ string \ here”.Contains(“\\”); - >返回TRUE'。请从调试器发布屏幕截图,以显示运行时的值 –

+0

ok第一个字母在您的字符串中跳动\是什么?它总是一样吗?是否可以是字符串实际上是** \ t **选项卡或甚至是** \ n **新行分隔?=! –

回答

4

逃离转义序列使用它两次:

"\\" 

或字符串前使用@逐字字符串字面。它将强制编译器在没有任何转义序列的情况下直接解释字符串。见documentation

@"\" 

这意味着,在您要使用拆分可以使用this overload

string [] temp = @"your\string\here".Split(new string [] {@"\"}, StringSplitOptions.None); 

overload that accepts a char as parameter

string [] temp = @"your\string\here".Split('\\'); 

ContainsReplace工作类似:

bool cont = @"your\string\here".Contains(@"\"); 

string repl = @"your\string\here".Replace(@"\", " "); 

编辑:

您的更新后,可以很明显的是你的字符串制表符分隔:

enter image description here

你需要\t标签分裂呀!

string [] temp = @"aaa\taaa\taaa".Split('\t'); 

请阅读我发布的第一个链接。该文档说:

在正则字符串文字字符后面的反斜杠字符()后面的字符必须是以下字符之一:',“,\,0,a,b,f, n,r,t,u,U,x,v。否则,会发生编译时错误。

+0

valorCol.Split(@“\”); 错误:无法将'string'转换为'char' 在做.Split(“\\”)时,它从不分裂......如果我们做.Contains(“\\”)它也会返回false 但是,谢谢你的快速回答 –

+0

@CarmenGonzález-CondeMáizno。除了'string []'作为参数外,还有一个重载。你需要拿那个。另外指定'StringSplitOptions' –

+0

string [] splitValorCol = value.Split(@“\”); string [] splitValorCol = valorCol.Split(“\\”); 这没有分裂 –

2

要在C#中使用反斜杠字符,您需要用另一个反斜杠('\\')转义它。此外,String.Split方法需要一个字符数组(不是单个字符串或字符)。

所以,你的代码应该是这样的:

value.Split(new char[] { '\\' }) 

一个在线演示中看到这个dotNetFiddle

+0

你好,这个doenst工作,它不分裂:( string [] splitValorCol = @ valorCol.Split(new char [] {'\\'}); –

+0

它适用于我。看到这个在线演示:https://dotnetfiddle.net/gLSEXc。你确定你的字符串实际上包含反斜杠字符吗? –

+1

有什么可疑的字符串OP正在测试。否则“value.Contains( “\\”); --->返回false“会返回TRUE –