如何从csv中提取值,例如使用模式删除新行字符(\r\n
或\n
)。
一行如下:
1.1;2.2;Example, 3
请注意,只有3个值,分隔符为;
。我遇到的问题是提出一个模式,在删除新行字符时读取值(该文件来自Windows机器,因此它有\ r \ n,从linux读取它并希望独立从使用的新行字符开始。)
我现在的简单例子是:
s = "1.1;2.2;Example, 3\r\n";
p = "(.-);(.-);(.-)";
a, b, c = string.match(s, p);
print(c:byte(1, -1));
上面代码打印的最后两个字符是\r\n
。
问题是%c和%s类(控制字符和空格字符)检测到\r
和\n
,如下代码所示:
s = "a\r";
print(s:match("%c"));
print(s:match("%s"));
print(s:match("%d"));
那么,是否有可能从比赛中省略新的线条字符? (不应该假设最后两个字符是新行字符)
3º值可能包含空格,标点符号和字母数字字符,因为\r\n
被检测为空格字符,形式为“”(.-);(.-);([%w%s%c] - )。*“不起作用。
答案 0 :(得分:3)
没有任何经验,我找到了一个天真的解决方案:
clean_CR = s:gsub("\r","");
clean_NL = clean_CR:gsub("\n","");
使用POSIX正则表达式语法我会使用
^([^;]*);([^;]*);([^\n\r]*).*$
..“\ n”和“\ r”可能包括为“^ M”,“^ @”(控制/ unicode字符)..取决于你的编辑。
答案 1 :(得分:3)
你的模式
p = "(.-);(.-);(.-)";
不起作用:第三个字段始终为空,因为.-
尽可能匹配。您需要将其锚定在字符串的末尾,但第三个字段将包含尾随的换行符:
p = "(.-);(.-);(.-)$";
所以,只需停在第一个尾随换行符char。这也是最后一场比赛的主力。请尝试使用此模式:
p = "(.-);(.-);(.-)[\r\n]";
如果尾随换行符是可选的,请尝试以下模式:
p = "(.-);(.-);(.-)[\r\n]*$";