R:浏览文件夹中的文件并从中提取名称和数据
R : Browsing files in a folder and extracting names and data from it
我需要从电子表格中提取一些数据,其中有很多(超过一百个)所以我认为用一些 R 脚本来做会更快。 (也许那是 my first error,但我想尝试一下并提高自己使用 R 操作文件和数据的能力。)
所有这些文件都在同一个文件夹中,其中大部分都有气象站或城市的名称,只有一些文件无关。此外,它们的扩展名并不完全相同:有些是 .csv,有些是 .xls,有些是 .txt、.zip 或 .r(这些是不需要的文件)
我想做的是浏览我的文件夹,选择与我相关的文件名,只保留city/station的文件名,打开文件,收集我需要的信息,关闭它并转到下一个文件。
另外,有些城市有多个站点,或者同一个站点有多个文件。例如:
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 文件。如果存在“_”,那么我只保留它之前的内容,如果城市不在数据框中,则存储它,如果不存在,那么我只删除扩展名以获取城市名称。我需要关于文件扩展名的这两种情况,因为内部数据的格式不同:例如,站点 ID 在 .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"
这里是我的代码的输出(Id 很容易获得,但可能不是其余的...):
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
感谢您的见解和帮助。
问候。
EDIT: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
代码
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))]
变化
这些变化基于 OP 的特定要求。有关每个变体的更多详细信息,请参阅 结果 下的 差异 部分。可以组合以下方法以满足多个差异。
方法一
添加 |^[\p{Lu}_\d]+
以匹配从字符串开头到扩展名的大写字母、下划线和数字的任意组合。
^\p{Ll}.*$|(?:[_.]\d.*|(?:^\d+|^[\p{Lu}_\d]+)?\.[^.]+)$
方法二
添加 |^\p{L}+(?:_\p{L}+)+
以匹配任意字母一次或多次,后跟一个或多个 [下划线后跟一个或多个字母]
^\p{Ll}.*$|(?:[_.]\d.*|(?:^\d+|^\p{L}+(?:_\p{L}+)+)?\.[^.]+)$
结果
注意:下面的结果集与您的预期输出之间存在一些差异。
差异
Clermont.Fd
:这是因为Clermond != Clermont
(d
对比 t
)。
ENVOI_METEO
:参见变体:方法 1,但它可能会对有效名称产生负面影响,因此我'通过将其从答案的实际代码中排除,我们已将此 fix 设为可选。
Grenoble.St.Martin.heres
:您的某些输入在 .
之后包含小写字母(参见 Cap.de.la.Heve.Le.Havre
、Grenoble.le.versoud
和 Biarritz.anglet
)。我不确定您想如何将其与其他结果区分开来。
Luxeuil
:和Luxeil
不一样,所以不删
Mise_en_forme
:其他有效条目包括 _
(参见 La-Rochelle_Aerodrome
),因此我不确定从结果集中删除该值的前提是什么。如果是因为它不包含任何 .
或 -
字符,您可以使用 Variations 处的模式:方法 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}]
(匹配任何 language/script - Unicode 中不是字母或数字的任何字符)。
- 例如:
Bale-Mulhouse
变为 BaleMulhouse
Bale.Mulhouse
变为 BaleMulhouse
x[-which(duplicated(y))]
删除在 y
中找到重复值的索引(在删除非字母数字字符之后)。
- 例如(参见上一个要点的
BaleMulhouse
示例):
BaleMulhouse
重复项已删除。重复项被定义为所有重复项 除了 同类中的第一个,因此,将仅保留一组重复项中的第一个。
我需要从电子表格中提取一些数据,其中有很多(超过一百个)所以我认为用一些 R 脚本来做会更快。 (也许那是 my first error,但我想尝试一下并提高自己使用 R 操作文件和数据的能力。)
所有这些文件都在同一个文件夹中,其中大部分都有气象站或城市的名称,只有一些文件无关。此外,它们的扩展名并不完全相同:有些是 .csv,有些是 .xls,有些是 .txt、.zip 或 .r(这些是不需要的文件)
我想做的是浏览我的文件夹,选择与我相关的文件名,只保留city/station的文件名,打开文件,收集我需要的信息,关闭它并转到下一个文件。
另外,有些城市有多个站点,或者同一个站点有多个文件。例如:
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 文件。如果存在“_”,那么我只保留它之前的内容,如果城市不在数据框中,则存储它,如果不存在,那么我只删除扩展名以获取城市名称。我需要关于文件扩展名的这两种情况,因为内部数据的格式不同:例如,站点 ID 在 .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"
这里是我的代码的输出(Id 很容易获得,但可能不是其余的...):
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
感谢您的见解和帮助。 问候。
EDIT: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
代码
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))]
变化
这些变化基于 OP 的特定要求。有关每个变体的更多详细信息,请参阅 结果 下的 差异 部分。可以组合以下方法以满足多个差异。
方法一
添加 |^[\p{Lu}_\d]+
以匹配从字符串开头到扩展名的大写字母、下划线和数字的任意组合。
^\p{Ll}.*$|(?:[_.]\d.*|(?:^\d+|^[\p{Lu}_\d]+)?\.[^.]+)$
方法二
添加 |^\p{L}+(?:_\p{L}+)+
以匹配任意字母一次或多次,后跟一个或多个 [下划线后跟一个或多个字母]
^\p{Ll}.*$|(?:[_.]\d.*|(?:^\d+|^\p{L}+(?:_\p{L}+)+)?\.[^.]+)$
结果
注意:下面的结果集与您的预期输出之间存在一些差异。
差异
Clermont.Fd
:这是因为Clermond != Clermont
(d
对比t
)。ENVOI_METEO
:参见变体:方法 1,但它可能会对有效名称产生负面影响,因此我'通过将其从答案的实际代码中排除,我们已将此 fix 设为可选。Grenoble.St.Martin.heres
:您的某些输入在.
之后包含小写字母(参见Cap.de.la.Heve.Le.Havre
、Grenoble.le.versoud
和Biarritz.anglet
)。我不确定您想如何将其与其他结果区分开来。Luxeuil
:和Luxeil
不一样,所以不删Mise_en_forme
:其他有效条目包括_
(参见La-Rochelle_Aerodrome
),因此我不确定从结果集中删除该值的前提是什么。如果是因为它不包含任何.
或-
字符,您可以使用 Variations 处的模式:方法 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}]
(匹配任何 language/script - Unicode 中不是字母或数字的任何字符)。- 例如:
Bale-Mulhouse
变为BaleMulhouse
Bale.Mulhouse
变为BaleMulhouse
- 例如:
x[-which(duplicated(y))]
删除在y
中找到重复值的索引(在删除非字母数字字符之后)。- 例如(参见上一个要点的
BaleMulhouse
示例):BaleMulhouse
重复项已删除。重复项被定义为所有重复项 除了 同类中的第一个,因此,将仅保留一组重复项中的第一个。
- 例如(参见上一个要点的