2011-05-17 59 views
9

請考慮以下以逗號分隔的文件。爲簡單起見讓它包含一條線:如何閱讀包含轉義引號的引用文本


'I am quoted','so, can use comma inside - it is not separator here','but can\'t use escaped quote :=(' 

如果你試圖用命令

table <- read.csv(filename, header=FALSE) 

線路將被分離到4個部分讀它,因爲行包含3逗號。事實上,我只想閱讀3部分,其中一部分包含逗號本身。有報價標誌來幫助。我試過了:

table <- read.csv(filename, header=FALSE, quote="'") 

但是這個錯誤是"incomplete final line found by readTableHeader on table"。這是因爲奇數(七)的報價。

read.table()以及scan()有參數allowEscapes,但將其設置爲TRUE沒有幫助。它是確定,從help(scan)原因可以讀:

被解釋的逃逸是所述控制字符 '\一個,\ B,\樓\ N,\ R,\噸,\ V', ... ... 任何其他逃脫 字符將被視爲本身,包括反斜槓

請提出你會怎麼看這種報價的CSV文件,內含逃脫\'報價。

+0

我明白你想要做什麼,但很困惑你爲什麼要使用'read.csv()':這不是一個CSV文件,沒有多列,它只是一個文本塊,儘管引號。你說行是分開還是不行,爲什麼不用'readLines(...,n = 1)'?你必須表示它是包含轉義引號的多行文本。 – smci 2016-09-22 04:27:45

回答

5

一種可能性是使用readLines()把一切作爲被讀出,然後由別的東西代替引號字符進行,如:

tt <- readLines("F:/temp/test.txt") 
tt <- gsub("([^\\]|^)'","\\1\"",tt) # replace ' by " 
tt <- gsub("\\\\","\\",tt) # get rid of the double escape due to readLines 

這可以讓你閱讀載體TT在使用textConnection

zz <- textConnection(tt) 
read.csv(zz,header=F,quote="\"") # give text input 
close(zz) 

不是最漂亮的解決方案,但它的工作原理(只要你不將文件中有「字的地方偏離航向......)

+2

如果你用'''替換'\'',那麼'read.csv'會處理它。 – Marek 2011-05-17 15:14:55

+0

@Marek:我並不完全關注。我應該在哪裏取而代之以獲得正確的輸出? – 2011-05-17 15:37:09

+3

我的意思是'tt < - readLines(file); tt < - gsub(「\\\\'」,「''」,tt); read.csv(textConnection(tt),header = FALSE,quote =「'」)導致雙引號被正確讀取(參見'?scan' - > Details - > quotes)。 – Marek 2011-05-17 21:11:35