R: Просмотр файлов в папке и извлечение имен и данных из нее
Мне нужно извлечь некоторые данные из электронных таблиц, их много (более ста), поэтому я подумал, что будет быстрее сделать это с помощью некоторого R-скрипта. (Возможно, это моя первая ошибка, но я хотел бы попробовать и улучшить себя в манипулировании файлами и данными с использованием R.)
Все эти файлы находятся в одних и тех же папках, большинство из них имеют название метеостанции или города, только некоторые файлы не имеют значения. Более того, они не имеют одинаковых расширений: некоторые из них.csv, другие.xls, некоторые.txt, .zip или.r (это нежелательные файлы)
То, что я хочу сделать, это просмотреть мою папку, выбрать имя файла, если оно имеет отношение ко мне, только сохранить название города / станции, открыть файл, собрать нужную мне информацию, закрыть его и перейти к следующему файл.
Кроме того, в некоторых городах есть несколько станций или есть несколько файлов для одной и той же станции. Например:
SomeCity.csv and SomeCity_1966-2001.csv
AnotherCity.station1.xls, AnotherCity.station2.xls
ACity.station.xls, ACity_1977-2005.csv
My.City.csv, My-City.csv
Так что да, это не всегда так просто...
Вот что я сделал на данный момент, я смотрю только на файлы.csv и.xls. Если присутствует "_", то я сохраняю только то, что находится перед ним, и запасаю его, если города еще нет в информационном фрейме, если его нет, тогда я просто удаляю расширение, чтобы получить название города. Мне нужно иметь эти 2 случая, касающиеся расширения файла, потому что данные внутри не отформатированы одинаково: например, идентификатор станции находится в первом столбце в.xls, тогда как во втором столбце в.csv...
# Read files names :
files_list <- list.files(path="my/path/to/files")
n_files <- length(files_list)
df_out <- data.frame(matrix(ncol = 6, nrow = n_files))
x <- c("Name","Id","Granularity","Start","End","Missing")
colnames(df_out) <- x
i=1
j=1
# Browing the list of files
while(j<n_files)
{
file = files_list[j]
# Case of a .csv file :
if(grepl(".csv",file))
{
if(!grepl("_",file))
{
df_out$Name[i] <- gsub("\\.csv","",file)
i <- i+1
}
else if(!any(grepl(gsub("\\_.*","",file),df_out$Name)))
{
df_out$Name[i] <- gsub("\\_.*","",file)
i <- i+1
}
}
# Case of a .xls file :
else if(grepl(".xls",file))
{
if(!grepl("_",file))
{
df_out$Nom[i] <- gsub("\\.xls","",file)
i <- i+1
}
else if(!any(grepl(gsub("\\_.*","",file),df_out$Name)))
{
df_out$Nom[i] <- gsub("\\_.*","",file)
i <- i+1
}
}
j <- j+1
}
df_out <- df_out[1:i-1,]
Проблема: в случае "My.city" и "My-City" у меня будет 2 разных записи в моем фрейме данных для одной и той же станции, как я могу избежать этого? Я думал об удалении "." или "-" и запишите название MyCity и посмотрите, не появился ли уже другой MyCity, но жителям My-City не очень приятно портить название города. Шучу, я просто чувствую, что есть лучший способ сделать это с помощью регулярных выражений. Честно говоря, я чувствую, что большинство вещей, которые я делаю, могут быть сделаны в несколько строк с помощью регулярных выражений.
Вот фактический список файлов, которые у меня есть:
"200601.txt"
"Abbeville.xls"
"Abbeville_1971-2005.csv"
"Agen.xls"
"Agen_1961-2005.csv"
"Ajaccio.xls"
"Ajaccio_1961-2003.csv"
"Auxerre.xls"
"Auxerre_1961-2005.csv"
"Bale-Mulhouse_1961-2005.csv"
"Bale.Mulhouse.xls"
"Beauvais_1994-2005.csv"
"Beauvais_2001-2005.csv"
"Besancon.xls"
"Besancon_1961-2005.csv"
"Biarritz.anglet.xls"
"Biarritz_1961-2005.csv"
"Bonneville.xls"
"Bordeaux.Merignac.xls"
"Bordeaux_1961-2005.csv"
"Boulogne_1994-2005.csv"
"Boulogne_2001-2005.csv"
"Bourg-St-Maurice_1994-2005.csv"
"Bourg-St-Maurice_2001-2005.csv"
"Bourges.xls"
"Bourges_1961-2005.csv"
"Brest.Guipavas.xls"
"Brest_1961-2005_sauf_1989.csv"
"Brive.xls"
"Caen.Carpiquet.xls"
"Caen_1961-2005.csv"
"Cap.de.la.Heve.Le.Havre.xls"
"Carcassonne.xls"
"Cazaux.xls"
"Chambery.Aix.xls"
"Chambery_1974-2005.csv"
"Charleville.Mezieres.xls"
"Chartres.xls"
"Chartres_1961-2005.csv"
"Clermond-Fd_1961-2005.csv"
"Clermont.Fd.xls"
"Cognac.xls"
"Cognac_1961-2005.csv"
"Colmar.xls"
"Dijon.xls"
"Dijon_1961-2005.csv"
"Dinard.xls"
"Dinard_1961-2005.csv"
"Dinard_2003-2005.csv"
"donnees_triH_1961_2005.csv
"Dunkerque.txt"
"Dunkerque_1974-2008.csv"
"Embrun.xls"
"Embrun_1961-2005.csv"
"ENVOI_METEO_20040405.zip"
"Gourdon_1994-2005.csv"
"Gourdon_2001-2005.csv"
"Grenoble.le.versoud.xls"
"Grenoble.St.Geoirs.xls"
"Grenoble.St.Martin.heres.xls"
"Grenoble_1968-2005.csv"
"historiques Bordeaux et Dinard.txt"
"Hyeres_2007-2009.csv"
"Istres.csv"
"Istres.txt"
"La-Rochelle_1961-2005.csv"
"La-Rochelle_Aerodrome_2007-2009.csv"
"La.Rochelle.xls"
"Le.Puy.xls"
"Le.Touquet.xls"
"Lille.xls"
"Lille_1961-2005.csv"
"losvari.11069001.txt"
"losvari.14137001.txt"
"losvari.17300001.txt"
"losvari.31069001.txt"
"losvari.33529001.txt"
"losvari.62826001.txt"
"losvari.64549001.txt"
"losvari.76552001.txt"
"losvari.78621001.txt"
"Luxeil.xls"
"Luxeuil_1961-2005.csv"
"Lyon.Bron.xls"
"Lyon_1961-2005.csv"
"Macon_1994-2005.csv"
"Macon_2001-2005.csv"
"Marignane.xls"
"Marignane_1961-2005.csv"
"Metz.Frescaty.xls"
"Metz_1961-2005.csv"
"Millau.xls"
"Mise_en_forme.r"
"Montelimar.xls"
"Montelimar_1961-2005.csv"
"Montpellier.xls"
"Montpellier_1961-2005.csv"
"Nantes.Bouguenais.xls"
"Nantes_1961-2005.csv"
"Nice.xls"
"Nice_1961-2005.csv"
"Nimes.Courbessac.xls"
"Nimes_1961-2005.csv"
"Orange.xls"
"Orange_1961-2005.csv"
"Orleans.xls"
"Orleans_1961-2005.csv"
"Paris_1950-2005.csv"
"Paris1.xls"
"Pau.Uzein.xls"
"Pau_03-2006.csv"
"Pau_1961-2005.csv"
"Perpignan.xls"
"Perpignan_1961-2005.csv"
"Reims.Courcy.xls"
"Reims_1961-2005.csv"
"Rennes.St.Jacques.xls"
"Rennes_1961-2005.csv"
"Rennes_1961-2005_sauf_2003-2004.csv"
"Rennes_2003-2004.csv"
"Rouen.Boos.xls"
"Rouen_1969-2005.csv"
"Saint.Brieuc.xls"
"Saint.Girons.xls"
"St-Etienne_1961-2005.csv"
"St-Girons_1961-2005.csv"
"St-Quentin_1961-2008.csv"
"St.Auban.xls"
"St.Etienne.Boutheon.xls"
"St.Quentin.xls"
"Strasbourg.Entzheim.xls"
"Strasbourg_1949-2005.csv"
"Toulon.xls"
"Toulon_1961-2005.csv"
"Toulouse.Blagnac.xls"
"Toulouse_1961-2005.csv"
"Tours.xls"
"Tours_1960-2005.csv"
И вот вывод моего кода (идентификатор будет легко получить, но, возможно, не все остальное...):
Name Id Granularity Start End Missing
1 Abbeville NA NA NA NA NA
2 Agen NA NA NA NA NA
3 Ajaccio NA NA NA NA NA
4 Auxerre NA NA NA NA NA
5 Bale-Mulhouse NA NA NA NA NA
6 Bale.Mulhouse NA NA NA NA NA
7 Beauvais NA NA NA NA NA
8 Besancon NA NA NA NA NA
9 Biarritz.anglet NA NA NA NA NA
10 Bonneville NA NA NA NA NA
11 Bordeaux.Merignac NA NA NA NA NA
12 Boulogne NA NA NA NA NA
13 Bourg-St-Maurice NA NA NA NA NA
14 Bourges NA NA NA NA NA
15 Brest.Guipavas NA NA NA NA NA
16 Brive NA NA NA NA NA
17 Caen.Carpiquet NA NA NA NA NA
18 Cap.de.la.Heve.Le.Havre NA NA NA NA NA
19 Carcassonne NA NA NA NA NA
20 Cazaux NA NA NA NA NA
21 Chambery.Aix NA NA NA NA NA
22 Charleville.Mezieres NA NA NA NA NA
23 Chartres NA NA NA NA NA
24 Clermond-Fd NA NA NA NA NA
25 Clermont.Fd NA NA NA NA NA
26 Cognac NA NA NA NA NA
27 Colmar NA NA NA NA NA
28 Dijon NA NA NA NA NA
29 Dinard NA NA NA NA NA
30 donnees NA NA NA NA NA
31 Dunkerque NA NA NA NA NA
32 Embrun NA NA NA NA NA
33 Gourdon NA NA NA NA NA
34 Grenoble.le.versoud NA NA NA NA NA
35 Grenoble.St.Geoirs NA NA NA NA NA
36 Grenoble.St.Martin.heres NA NA NA NA NA
37 Hyeres NA NA NA NA NA
38 Istres NA NA NA NA NA
39 La-Rochelle NA NA NA NA NA
40 La.Rochelle NA NA NA NA NA
41 Le.Puy NA NA NA NA NA
42 Le.Touquet NA NA NA NA NA
43 Lille NA NA NA NA NA
44 Luxeil NA NA NA NA NA
45 Luxeuil NA NA NA NA NA
46 Lyon.Bron NA NA NA NA NA
47 Macon NA NA NA NA NA
48 Marignane NA NA NA NA NA
49 Metz.Frescaty NA NA NA NA NA
50 Millau NA NA NA NA NA
51 Montelimar NA NA NA NA NA
52 Montpellier NA NA NA NA NA
53 Nantes.Bouguenais NA NA NA NA NA
54 Nice NA NA NA NA NA
55 Nimes.Courbessac NA NA NA NA NA
56 Orange NA NA NA NA NA
57 Orleans NA NA NA NA NA
58 Paris NA NA NA NA NA
59 Paris1 NA NA NA NA NA
60 Pau.Uzein NA NA NA NA NA
61 Perpignan NA NA NA NA NA
62 Reims.Courcy NA NA NA NA NA
63 Rennes.St.Jacques NA NA NA NA NA
64 Rouen.Boos NA NA NA NA NA
65 Saint.Brieuc NA NA NA NA NA
66 Saint.Girons NA NA NA NA NA
67 St-Etienne NA NA NA NA NA
68 St-Girons NA NA NA NA NA
69 St-Quentin NA NA NA NA NA
70 St.Auban NA NA NA NA NA
71 St.Etienne.Boutheon NA NA NA NA NA
72 St.Quentin NA NA NA NA NA
73 Strasbourg.Entzheim NA NA NA NA NA
74 Toulon NA NA NA NA NA
75 Toulouse.Blagnac NA NA NA NA NA
76 Tours NA NA NA NA NA
Спасибо за ваши идеи и помощь. С уважением.
РЕДАКТИРОВАТЬ: ожидаемый результат для df_out$Name: (Используя Id, я смогу сказать, является ли Grenoble.St.Geoirs той же станцией, что и Grenoble.St.Martin или нет, поэтому сейчас она все еще здесь.)
Abbeville
Agen
Ajaccio
Auxerre
Bale-Mulhouse
Beauvais
Besancon
Biarritz.anglet
Biarritz
Bonneville
Bordeaux.Merignac
Bordeaux
Boulogne
Bourg-St-Maurice
Bourges
Brest.Guipavas
Brest
Brive
Caen.Carpiquet
Caen
Cap.de.la.Heve.Le.Havre
Carcassonne
Cazaux
Chambery.Aix
Chambery
Charleville.Mezieres
Chartres
Clermond-Fd
Cognac
Colmar
Dijon
Dinard
Dunkerque
Embrun
Gourdon
Grenoble.le.versoud
Grenoble.St.Geoirs
Grenoble.St.Martin
Grenoble
Hyeres
Istres
La-Rochelle_Aerodrome
La-Rochelle
Le.Puy
Le.Touquet
Lille
Luxeil
Lyon.Bron
Lyon
Macon
Marignane
Metz.Frescaty
Metz
Millau
Montelimar
Montpellier
Nantes.Bouguenais
Nantes
Nice
Nimes.Courbessac
Nimes
Orange
Orleans
Paris
Paris1
Pau.Uzein
Pau
Perpignan
Reims.Courcy
Reims
Rennes.St.Jacques
Rennes
Rouen.Boos
Rouen
Saint.Brieuc
Saint.Girons
St-Etienne
St-Girons
St-Quentin
St.Auban
St.Etienne.Boutheon
Strasbourg.Entzheim
Strasbourg
Toulon
Toulouse.Blagnac
Toulouse
Tours
1 ответ
Код
Смотрите код в использовании здесь
x <- c("200601.txt","Abbeville.xls","Abbeville_1971-2005.csv","Agen.xls","Agen_1961-2005.csv","Ajaccio.xls","Ajaccio_1961-2003.csv","Auxerre.xls","Auxerre_1961-2005.csv","Bale-Mulhouse_1961-2005.csv","Bale.Mulhouse.xls","Beauvais_1994-2005.csv","Beauvais_2001-2005.csv","Besancon.xls","Besancon_1961-2005.csv","Biarritz.anglet.xls","Biarritz_1961-2005.csv","Bonneville.xls","Bordeaux.Merignac.xls","Bordeaux_1961-2005.csv","Boulogne_1994-2005.csv","Boulogne_2001-2005.csv","Bourg-St-Maurice_1994-2005.csv","Bourg-St-Maurice_2001-2005.csv","Bourges.xls","Bourges_1961-2005.csv","Brest.Guipavas.xls","Brest_1961-2005_sauf_1989.csv","Brive.xls","Caen.Carpiquet.xls","Caen_1961-2005.csv","Cap.de.la.Heve.Le.Havre.xls","Carcassonne.xls","Cazaux.xls","Chambery.Aix.xls","Chambery_1974-2005.csv","Charleville.Mezieres.xls","Chartres.xls","Chartres_1961-2005.csv","Clermond-Fd_1961-2005.csv","Clermont.Fd.xls","Cognac.xls","Cognac_1961-2005.csv","Colmar.xls","Dijon.xls","Dijon_1961-2005.csv","Dinard.xls","Dinard_1961-2005.csv","Dinard_2003-2005.csv","donnees_triH_1961_2005.csv","Dunkerque.txt","Dunkerque_1974-2008.csv","Embrun.xls","Embrun_1961-2005.csv","ENVOI_METEO_20040405.zip","Gourdon_1994-2005.csv","Gourdon_2001-2005.csv","Grenoble.le.versoud.xls","Grenoble.St.Geoirs.xls","Grenoble.St.Martin.heres.xls","Grenoble_1968-2005.csv","historiques Bordeaux et Dinard.txt","Hyeres_2007-2009.csv","Istres.csv","Istres.txt","La-Rochelle_1961-2005.csv","La-Rochelle_Aerodrome_2007-2009.csv","La.Rochelle.xls","Le.Puy.xls","Le.Touquet.xls","Lille.xls","Lille_1961-2005.csv","losvari.11069001.txt","losvari.14137001.txt","losvari.17300001.txt","losvari.31069001.txt","losvari.33529001.txt","losvari.62826001.txt","losvari.64549001.txt","losvari.76552001.txt","losvari.78621001.txt","Luxeil.xls","Luxeuil_1961-2005.csv","Lyon.Bron.xls","Lyon_1961-2005.csv","Macon_1994-2005.csv","Macon_2001-2005.csv","Marignane.xls","Marignane_1961-2005.csv","Metz.Frescaty.xls","Metz_1961-2005.csv","Millau.xls","Mise_en_forme.r","Montelimar.xls","Montelimar_1961-2005.csv","Montpellier.xls","Montpellier_1961-2005.csv","Nantes.Bouguenais.xls","Nantes_1961-2005.csv","Nice.xls","Nice_1961-2005.csv","Nimes.Courbessac.xls","Nimes_1961-2005.csv","Orange.xls","Orange_1961-2005.csv","Orleans.xls","Orleans_1961-2005.csv","Paris_1950-2005.csv","Paris1.xls","Pau.Uzein.xls","Pau_03-2006.csv","Pau_1961-2005.csv","Perpignan.xls","Perpignan_1961-2005.csv","Reims.Courcy.xls","Reims_1961-2005.csv","Rennes.St.Jacques.xls","Rennes_1961-2005.csv","Rennes_1961-2005_sauf_2003-2004.csv","Rennes_2003-2004.csv","Rouen.Boos.xls","Rouen_1969-2005.csv","Saint.Brieuc.xls","Saint.Girons.xls","St-Etienne_1961-2005.csv","St-Girons_1961-2005.csv","St-Quentin_1961-2008.csv","St.Auban.xls","St.Etienne.Boutheon.xls","St.Quentin.xls","Strasbourg.Entzheim.xls","Strasbourg_1949-2005.csv","Toulon.xls","Toulon_1961-2005.csv","Toulouse.Blagnac.xls","Toulouse_1961-2005.csv","Tours.xls","Tours_1960-2005.csv")
x <- gsub("^\\p{Ll}.*$|(?:[_.]\\d.*|(?:^\\d+)?\\.[^.]+)$", "", x, perl=TRUE)
x <- x[x != ""]
y <- gsub("[\\W_]", "", x, perl=TRUE)
x[-which(duplicated(y))]
вариации
Эти изменения основаны на конкретных требованиях ОП. Для получения более подробной информации о каждом варианте, пожалуйста, смотрите раздел Discrepencies под Результатами. Приведенные ниже методы могут быть объединены таким образом, чтобы они удовлетворяли множественным различиям.
Способ 1
Добавляет |^[\p{Lu}_\d]+
чтобы сопоставить любую комбинацию заглавных букв, подчеркивания и цифр от начала строки до расширения.
^\p{Ll}.*$|(?:[_.]\d.*|(?:^\d+|^[\p{Lu}_\d]+)?\.[^.]+)$
Способ 2
Добавляет |^\p{L}+(?:_\p{L}+)+
совпадать с любой буквой один или несколько раз, за которыми следует одна или несколько из [подчеркивание, за которым следуют одна или несколько букв]
^\p{Ll}.*$|(?:[_.]\d.*|(?:^\d+|^\p{L}+(?:_\p{L}+)+)?\.[^.]+)$
Результаты
Примечание. Существует несколько несоответствий между приведенным ниже набором результатов и ожидаемым результатом.
Discrepencies
Clermont.Fd
: Это потому чтоClermond != Clermont
(d
противt
).ENVOI_METEO
: См. Вариации: Метод 1, но это может иметь негативные последствия для допустимых имен, поэтому я сделал это исправление необязательным, исключив его из фактического кода ответа.Grenoble.St.Martin.heres
: Некоторые из ваших входных данных включают строчные буквы после.
(увидетьCap.de.la.Heve.Le.Havre
,Grenoble.le.versoud
, а такжеBiarritz.anglet
). Я не уверен, как вы хотите отличить это от остальных ваших результатов.Luxeuil
: Не то же самое, чтоLuxeil
так что я не удаляю это.Mise_en_forme
: Другие действительные записи включают_
(увидетьLa-Rochelle_Aerodrome
), таким образом я не уверен, что посылка удаляет это значение из набора результатов. Если это потому, что он не содержит.
или же-
символов, вы можете использовать шаблон в Вариации: Метод 2.
Выход
Abbeville
Agen
Ajaccio
Auxerre
Bale-Mulhouse
Beauvais
Besancon
Biarritz.anglet
Biarritz
Bonneville
Bordeaux.Merignac
Bordeaux
Boulogne
Bourg-St-Maurice
Bourges
Brest.Guipavas
Brest
Brive
Caen.Carpiquet
Caen
Cap.de.la.Heve.Le.Havre
Carcassonne
Cazaux
Chambery.Aix
Chambery
Charleville.Mezieres
Chartres
Clermond-Fd
Clermont.Fd
Cognac
Colmar
Dijon
Dinard
Dunkerque
Embrun
ENVOI_METEO
Gourdon
Grenoble.le.versoud
Grenoble.St.Geoirs
Grenoble.St.Martin.heres
Grenoble
Hyeres
Istres
La-Rochelle
La-Rochelle_Aerodrome
Le.Puy
Le.Touquet
Lille
Luxeil
Luxeuil
Lyon.Bron
Lyon
Macon
Marignane
Metz.Frescaty
Metz
Millau
Mise_en_forme
Montelimar
Montpellier
Nantes.Bouguenais
Nantes
Nice
Nimes.Courbessac
Nimes
Orange
Orleans
Paris
Paris1
Pau.Uzein
Pau
Perpignan
Reims.Courcy
Reims
Rennes.St.Jacques
Rennes
Rouen.Boos
Rouen
Saint.Brieuc
Saint.Girons
St-Etienne
St-Girons
St-Quentin
St.Auban
St.Etienne.Boutheon
Strasbourg.Entzheim
Strasbourg
Toulon
Toulouse.Blagnac
Toulouse
Tours
объяснение
x <- gsub("^\\p{Ll}.*$|(?:[_.]\\d.*|(?:^\\d+)?\\.[^.]+)$", "", x, perl=TRUE)
Заменить спички ничем.^\p{Ll}.*$|(?:[_.]\d.*|(?:^\d+)?\.[^.]+)$
Соответствует любому из следующих^\p{Ll}.*$
Сопоставьте следующее (это удаляетdonnes...
а такжеhsitorique...
так как они начинаются со строчных букв)^
Утвердить позицию в начале линии\p{Ll}
Совпадение любой строчной буквы на любом языке (Unicode).*
Совпадение с любым персонажем любое количество раз$
Утвердить позицию в конце строки
(?:[_.]\d.*|(?:^\d+)?\.[^.]+)$
Сопоставьте следующее (это удаляет подчеркивание или точки со следующими цифрами, расширениями файлов и именованными файлами только с номерами)(?:[_.]\d.*|(?:^\d+)?\.[^.]+)
Соответствует любому из следующих[_.]\d.*
Подходим следующее[_.]
Совпадение с любым символом в наборе (подчеркивание или точка)\d
Совпадение цифры.*
Совпадение с любым персонажем любое количество раз
(?:^\d+)?\.[^.]+
Подходим следующее(?:^\d+)?
Сопоставьте следующий ноль или один раз^
Утвердить позицию в начале линии\d+
Совпадение с одной или несколькими цифрами
\.
Матч точка буквально[^.]+
Совпадение с любым символом, отсутствующим в наборе (любой символ, кроме точки), один или несколько раз
$
Утвердить позицию в конце строки
x <- x[x != ""]
Удаляет пустые строки из вектораx
y <- gsub("[\\W_]", "", x, perl=TRUE)
Копииx
при замене всех символов, которые не являются символами слова, а также подчеркиванием ни с чем. В качестве альтернативы (или если это не всегда работает для вас),[^\p{L}\p{N}]
может быть использован (который соответствует любому символу, который не является буквой или цифрой на любом языке / сценарии - Unicode).- Например:
Bale-Mulhouse
становитсяBaleMulhouse
Bale.Mulhouse
становитсяBaleMulhouse
- Например:
x[-which(duplicated(y))]
Удаляет индексы, где повторяющиеся значения были найдены вy
(после удаления не буквенно-цифровых символов).- Например (см. Пример последней маркированной точки
BaleMulhouse
):BaleMulhouse
дубликат удаляется. Дубликаты определяются как все дубликаты, кроме первого в своем роде, таким образом, останется только первый из набора дубликатов.
- Например (см. Пример последней маркированной точки