2017-12-30 27 views
0

ich eine Textdatei mit einem Beispieltext haben wie unten alle in kleinen Fall:R Programmierung benötigen String basierend einzigartige Lösung für das Aufspalten großen Text

"venezuela probes ex-oil czar ramirez over alleged graft scheme 
caracas/houston (reuters) - venezuela is investigating rafael ramirez, a 
once powerful oil minister and former head of state oil company pdvsa, in 
connection with an alleged $4.8 billion vienna-based corruption scheme, the 
state prosecutor's office announced on friday. 


5.5 hours ago 
— reuters 


amazon ordered not to pull in customers who can't spell `birkenstock' 
a german court has ordered amazon not to lure internet shoppers to its 
online marketplace when they mistakenly search for "brikenstock", 
"birkenstok", "bierkenstock" and other variations in google. 


6 hours ago 
— business standard" 

Was ich in R benötigen, ist diese beiden Stücke von Text zu erhalten , getrennt.

Die erste Textstelle würde der Variablen text1 entsprechen und die zweite Textstelle sollte der Variablen text2 entsprechen.

Bitte denken Sie daran, ich habe viele textähnliche Absätze in dieser Datei. Die Lösung müsste beispielsweise für 100.000 Texte funktionieren.

Das einzige, was ich dachte, dass könnte als Trennzeichen verwendet werden "-", aber damit verliere ich die Quelle der Informationen wie "Reuters" oder "Business-Standard". Ich brauche das auch.

Würdest du wissen, wie dies in R zu erreichen?

+0

"zig Text wie diese", fand ich das ziemlich komisch für mich zu lesen . – InfiniteFlashChess

+0

Wie liest es jetzt, wissen Sie die Lösung @InfiniteFlashChess –

+0

Ich habe eine vorgeschlagene Bearbeitung, um mit Ihrem Beitrag zu helfen, wenn es hilft. – InfiniteFlashChess

Antwort

6

den Text aus dem Feld Lesen mit readLines und spaltete dann auf dem verschobenen cumsum des Auftretens dieses speziellen Strichs in von dem Herausgebers:

Lines <- readLines("Lines.txt") # from file in wd() 
split(Lines, cumsum(c(0, head(grepl("—", Lines),-1)))) 
#-------------- 
$`0` 
[1] "venezuela probes ex-oil czar ramirez over alleged graft scheme"    
[2] "caracas/houston (reuters) - venezuela is investigating rafael ramirez, a " 
[3] "once powerful oil minister and former head of state oil company pdvsa, in " 
[4] "connection with an alleged $4.8 billion vienna-based corruption scheme, the " 
[5] "state prosecutor's office announced on friday."        
[6] "5.5 hours ago"                
[7] "— reuters"                 

$`1` 
[1] "amazon ordered not to pull in customers who can't spell `birkenstock'" 
[2] "a german court has ordered amazon not to lure internet shoppers to its " 
[3] "online marketplace when they mistakenly search for \"brikenstock\", " 
[4] "\"birkenstok\", \"bierkenstock\" and other variations in google."  
[5] "6 hours ago"                
[6] "— business standard'" 

Es ist kein reguläres „-“. Es ist ein "-". Und beachten Sie, dass standardmäßig readLines die Leerzeilen weglassen.

+0

Können Sie die 'readLines()' Option zum Auslassen leerer Zeilen angeben? Das ist kein Standardverhalten. – hrbrmstr

+0

Färbe mich verwirrt. Ich kopierte den Text in einen Dateinamen "Lines.txt", gab den R-Konsolenbefehl 'Lines <- readLines (" Lines.txt ") aus und beobachtete das Ergebnis. Ich kann dieses Verhalten jetzt nicht reproduzieren. –

+0

Ich habe das auch versucht und konnte die leeren Zeilen nicht einfach weglassen. Es gibt eine Skip-NULL-Option, aber das ändert nichts. – Arani

1

Hier ist was ich tun könnte. Ich mag die Schleife nicht, aber ich konnte sie nicht vektorisieren. Hoffentlich wird diese Antwort zumindest als Ausgangspunkt für andere bessere Antworten dienen.

Annahmen: Alle Herausgeber Namen von vorangestellt werden "-"

TEXT <- read.delim2("C:/Users/Arani.das/Desktop/TEXT.txt", header=FALSE, quote="", stringsAsFactors=F) 
TEXT$Publisher <- grepl("— ", TEXT$V1) 
TEXT$V1 <- gsub("^\\s+|\\s+$", "", TEXT$V1) #trim whitespaces in start and end of line 
TEXT$FLAG <- 1 #grouping variable 
for(i in 2:nrow(TEXT)){ 
    if(TEXT$Publisher[i-1]==T){TEXT$FLAG[i]=TEXT$FLAG[i]+1}else{TEXT$FLAG[i]=TEXT$FLAG[i-1]} 
} # Grouping entries 
TEXT <- data.table::data.table(TEXT, key="FLAG") 
TEXT2 <- TEXT[, list(News=paste0(V1[1:(length(V1)-2)], collapse=" "), Time=V1[length(V1)-1], Publisher=V1[length(V1)]), by="FLAG"] 

Ausgang:

FLAG News   Time   Publisher 
1 Venezuela... 5.5 hours ago — reuters 
2 amazon...  6 hours ago — business standard 
+0

Ihre Annahme auf Pubisher ist korrekt. @Arani –

+0

Ich mag die Art, wie Sie die ganzen Daten in einen ordentlich strukturierten Datenrahmen umgewandelt haben, lassen Sie mich versuchen, um zu sehen, ob diese Lösung wirklich auf der riesigen Datei funktioniert. @Arani –

+0

Funktioniert nicht, gibt Zeit und Publisher in der gleichen Spalte V1 Spalte. Dies ist keine gute Lösung. @Arani –

Verwandte Themen