我有一个CSV文件,我想转换
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, maecenas porttitor congue massa
收件人
<text>
<name>Lorem ipsum dolor sit amet</name>
<element>consectetuer adipiscing elit</element>
<desc> maecenas porttitor congue massa</desc>
</text>
我可以使用以下搜索表达式来完成此简单案例:
^([^,]*),([^,]*),([^,]*),
^
-查找行的开头([^,]*),
-查找零个或多个不是逗号的字符,然后是逗号,并将其分组(执行3次)替换表达式为:
<text>\n <name>$1</name>\n <element>$2</element>\n <desc>$3</desc>\n</test>\n
这适用于简单的情况。但是,有时CSV中的一个值会嵌入逗号,在这种情况下,该值周围会带有引号。
Lorem ipsum dolor sit amet, "consectetuer, adipiscing elit", maecenas porttitor congue massa
因此第二个值(将是一个
<text>
<name>Lorem ipsum dolor sit amet</name>
<element>consectetuer, adipiscing elit</element>
<desc> maecenas porttitor congue massa</desc>
</text>
也就是说,
然后,为了使它更混乱,字符串可能还包含引号,并用引号将其转义(或者至少是从Google工作表生成并保存为CSV的CSV格式)
Lorem ipsum dolor sit amet, "and he said, ""no way!"", to my astonishment", maecenas porttitor congue massa
我想结束:
<text>
<name>Lorem ipsum dolor sit amet</name>
<element>and he said, "no way!", to my astonishment</element>
<desc> maecenas porttitor congue massa</desc>
</text>
因此,
在尝试创建搜索正则表达式时我迷路了。
答案 0 :(得分:1)
遵循这些原则应该可以起作用:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
LoadListerListViewObject currentObject = loadListerListViewObjectArrayList.get(position);
//If the object is inactive...
if (!currentObject.getIsActivated()) {
//Set the object as active and change the color to green
loadListerListViewObjectArrayList.set(position, new LoadListerListViewObject(currentObject.getDate(), currentObject.getTagNumber() true));
view.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
//If the object is active...
} else {
//Set the object as active and change the color to grey
loadListerListViewObjectArrayList.set(position, new LoadListerListViewObject(currentObject.getDate(), currentObject.getTagNumber(), false));
view.setBackgroundColor(getResources().getColor(R.color.colorGreyForButton));
}
}
});
基本上是相同的模式...重复了3次。
空格,然后是捕获组,捕获组是一系列非逗号,或者最好是^\s* ( " (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*))
,后跟(不是"
的任何内容)或"
,最后是用结束语引用。
您需要在下面的链接上单击“忽略空白”按钮。
使用{3}表示法而不是重复模式3次是可以的,甚至可以用来代替“”,但是我不确定如何通过UI进入重复的捕获组。
答案 1 :(得分:-1)
我不是Visual Studio代码专家。但是我认为可以不使用正则表达式
下面的python代码应该给一个想法
关键是忽略逗号,直到引号配对为止。
data = 'Lorem ipsum dolor sit amet, "and he said, ""no way!"", to my astonishment", maecenas porttitor congue massa'
items = data.split(',')
result = []
for i in range(len(items)):
if (len(result) == 0):
result.append(items[i])
continue
# If last item has odd number of quotes, it needs pairing - Ignore commas
if (result[-1].count('"') % 2):
# Append to last element
result[-1] += ',' + items[i]
else:
result.append(items[i])
print("\n".join(result))
输出
Lorem ipsum dolor sit amet
"and he said, ""no way!"", to my astonishment"
maecenas porttitor congue massa
如果需要有关代码的更多说明,请告诉我