2016-12-15 19 views
-1

替代轉義字符我有這個字符串:無法在字符串

str = "no,\"contact_last_name\",\"token\"" 
=> "no,\"contact_last_name\",\"token\"" 

我想刪除逃脫雙引號的字符串的字符\"。我用gsub

result = str.gsub('\\"','') 
=> "no,\"contact_last_name\",\"token\"" 

看來,字符串中的字符串並沒有取代雙引號轉義字符。

我爲什麼要這麼做?我有這個csv文件:

no,"contact_last_name","token",company,urbanization,sec-"property_address","property_address",city-state-zip,ase,oel,presorttrayid,presortdate,imbno,encodedimbno,fca,"property_city","property_state","property_zip" 
1,MARIE A JEANTY,1083123,,,,17 SW 6TH AVE,DANIA BEACH FL 33004-3260,Electronic Service Requested,,T00215,12/14/2016,00-314-901373799-105112-33004-3260-17,TATTTADTATTDDDTTFDDFATFTDDDTTFADTTDFAAADDATDAATTFDTDFTTAFFTTATFFF,017,DANIA BEACH,FL, 33004-3260 

當我嘗試使用CSV打開它,我收到以下錯誤:一旦我刪除了第一行(標題)在那些雙引號中的字符串

CSV.foreach(path, headers: true) do |row| 
end 
CSV::MalformedCSVError: Illegal quoting in line 1. 

,錯誤消失了。所以,我想我之前通過CSV運行它來刪除這些雙引號字符串:

file = File.open "file.csv" 
contents = file.read 
"no,\"contact_last_name\",\"token\" ... " 
contents.gsub!('\\"','') 

如此反覆,我的問題是,爲什麼是GSUB不刪除指定的字符?請注意,此實際工作:

contents.gsub /"/, "" 

就好像字符串忽略\字符。

+0

怎麼樣string.delete('「\') – Brad

+0

@Brad我想我找到了解決方案:contents.gsub /」/,「」 – Donato

+0

請閱讀「[mcve]」。請不要使用指向所需輸入數據的鏈接,而應將其減少到複製問題所需的最低限度。鏈接腐爛然後破裂,當他們做這個問題將不會像它將是如果你使它獨立。 –

回答

1

有此字符串沒有逃脫雙引號:

"no,\"contact_last_name\",\"token\"" 

譯員承認上面的字符串文本,因爲它是雙引號括起來。由於相同的原因,嵌入在字符串中的雙引號必須被轉義;否則它們表示字符串的結尾。

封閉雙引號字符是語言的一部分,不是字符串的一部分。使用反斜槓(\)作爲轉義字符也是語言在字符串中放置字符的方式,否則字符串具有特殊含義(雙引號)。

存儲在str變量的實際字符串是:

no,"contact_last_name","token" 

您可以檢查自己這一點,如果你告訴解釋把字符串在屏幕上(puts str)。


要從問題的標題回答這個問題,所有的努力來替代轉義字符的字符串都白費了,只是因爲字符串不包含你試圖查找和替換的字符序列。


而實際的問題是CSV文件格式不正確。第一行的第六個值(sec-"property_address")不符合正確編碼的CSV文件的格式。

它應該讀取sec-property_address"sec-property_address";即該值應該不包含在引號中或完全用引號引起來。將它部分用引號引起來會混淆Ruby的CSV解析器。

1

該字符串看起來不錯;你不明白你所看到的。默想這一點:

"no,\"contact_last_name\",\"token\"" # => "no,\"contact_last_name\",\"token\"" 
'no,"contact_last_name","token"'  # => "no,\"contact_last_name\",\"token\"" 
%q[no,"contact_last_name","token"] # => "no,\"contact_last_name\",\"token\"" 
%Q#no,"contact_last_name","token"# # => "no,\"contact_last_name\",\"token\"" 

當由雙引號分隔的字符串看,有必要逃避某些字符,如嵌入式雙引號。 Ruby和許多其他語言一樣,有多種定義字符串的方式來消除這種需求。