2016-06-21 55 views
1

我有一個;分離的文件,不幸的是,B列中的字符串未被引用。更糟的是,我有:自由文本包含分隔符:連接列

整數;一些文字;和其他一些文字;碼。導致A; B; C; null讀取我的文件時。

如何檢查額外的列是否爲空而不是連接B和(錯誤的)C?

我的文件的第一行:

iEpisodeId;iPatientId;sTitle;sICPC;dStart;dEnd;bProblem; 
1063862;1001513;St Na Hartinfarct;K76.02;1-2-1992;NA;1; 
1063865;1001513;Hypercholesterolaemie; Familiair 9.0;T93.01;1-1-1991;11- 12-2003;1; 
1063866;1001513;Algemene Episode;NA;31-7-1995;NA;0; 
1024407;1002509;Algemene Episode;NA;1-2-1989;NA;0; 

第二行(1063865)是一個給人麻煩(和其他171.000行...)。 我想用「familiair 9.0」來連接「Hypercholesteroaemie」到第3列3列轉移所有其他>向左移1

閱讀本身是沒有問題的:

test <- read_delim("test.csv", delim=";", col_name=T) 

然而,我得到額外的山坳:

names(test) 
[1] "iEpisodeId" "iPatientId" "sTitle"  "sICPC"  "dStart"  "dEnd"  "bProblem" NA   
+2

小樣本的數據會比您的問題描述更有幫助,請張貼一些樣本數據 –

+0

您能提供一個可重現的例子嗎?這對其他人更有幫助,而不是你試圖解釋/描述你的數據 – Sotos

+0

如果你使用'read.table'從文件中讀取數據,你可能會發現查看'colClasses'選項是很有用的,但從描述中很難知道。 –

回答

2

您可以通過逐行讀取文件行:

library(stringr) 
fileName <- "new 3.txt" 
conn <- file(fileName,open="r") 
linn <-readLines(conn) 
myTable = as.data.frame(matrix(ncol = 7, nrow = length(linn))) 
for (i in 1:length(linn)){ 
    line = linn[i] 
    if(str_count(line,";") ==8){ 
    index <- gregexpr(pattern =';',line)[[1]][3] 
    line <- gsub(paste("^(.{",index-1, "}).", sep=""), "\\1 ", line) 
    } 
    myTable[i,] = strsplit(line, split=";")[[1]] 
} 
close(conn) 
+0

您的代碼給我:head(linn) [1]「iEpisodeId; iPatientId; sTitle; sICPC; dStart; dEnd; bProblem ;;」 [2]「1063862; 1001513; St Na Hartinfarct; K76.02; 1-2-1992; NULL; 1 ;;」 [3]「1063865; 1001513; Hypercholesterolaemie Familiair 9.0; T93.01; 1-1-1991; 11-12-2003; 1 ;;」我仍然得到我必須擺脫的空窟窿,所以只有計數;我不會害怕。我必須檢查第8或第9列是否已填充,如果是的話......連接第3列和第4列 – dsent

+0

我已更新我的答案。您可以驗證第二個「half」列是否爲NA,而不是執行gsub行,但是如果這是您的需要,請使用子字符串。希望能幫助到你。 – Ale

+0

太棒了!就快到了。它運行良好(雖然在開始時添加linn [i] = gsub(pattern =「;;」,replace =「」,linn [i])以除去最後多餘的列);太多(因此:8列)。但我也有9,10個(同樣的問題)。最後一個建議來解決這個問題?也許運行多次? – dsent

相關問題