我有一个CSV文件,其中一列称为操作系统,包含一个字符串,其值如下所示:
win-abc123
def456-windows
123123-WIN-ghi789
rhel-jkl012
45u8234dgf-redhat-mno345
pqr678-RHEL
换句话说,列值在表示操作系统的字符串(前面、中间或结尾)的某处包含一个子字符串。值可以是win
、windows
、WIN
、rhel
、redhat
、RHEL
之一。你知道吗
我想检查列值,并用WIN
或RHEL
替换整个列来清理它。你知道吗
我有一个笨拙的解决办法。迭代CSV中的每一行,并迭代操作系统映射中的每个key, value
对。如果匹配,则替换CSV值。你知道吗
os_map = {'win':'WIN', 'windows': 'WIN', 'WIN':'WIN', 'rhel': 'RHEL', 'redhat': 'RHEL', 'RHEL': 'RHEL'}
for row in rows:
os = row[OPERATING_SYSTEM]
for key, value in os_map.iteritems():
if key in os:
row[OPERATING_SYSTEM] = value
break
或者,在java中:
Map<String, String> osMap = new HashMap<String, String>();
osMap.put("win", "WIN");
osMap.put("windows", "WIN");
osMap.put("WIN", "WIN");
// Repeat for RHEL values
String os;
for (String[] row : rows) {
os = row[OPERATING_SYSTEM];
for (Map.Entry<String, String> entry: osMap.entrySet()) {
if (os.contains(entry.getKey())) {
row[OPERATING_SYSTEM] = entry.getValue();
break;
}
}
}
我不喜欢这样,因为在找到匹配项之前,我要遍历整个映射(在最坏的情况下)。有什么更有效的方法来解决这个问题?你知道吗
如果CSV列只是win
或windows
,没有字母数字字符,我可以这样做:
os_map = {'win,windows,WIN': 'WIN', 'rhel,redhat,RHEL': 'RHEL'}
for key, value in os_map:
if key.contains(row[OPERATING_SYSTEM]):
row[OPERATING_SYSTEM] = value
break
但事实并非如此。你知道吗
在Python中,您可以按照以下方式进行操作:
你也可以做一个regex的dict:
或者将set和regex结合起来执行以下操作:
最好使用状态机或正则表达式。查看java库中的正则表达式以查找和替换语义。如果你是硬核,你可以扮演自己的状态机,这可能是最有效的方式来处理搜索部分。更换零件可能有点棘手。你知道吗
^{} 为这种类型的字符串替换提供了一些很好的语法。如果您的csv文件非常大,它可能非常适合:
相关问题 更多 >
编程相关推荐