Julia清洗字符串时报MethodError:无匹配SubString类型的remove_url方法
报错原因
- 直接触发报错的点:Julia里
split这类字符串切割函数返回的子串是SubString{String}类型,属于原字符串的视图,和String不是同一类型。你写的remove_url函数参数限定死了只能接String类型,传入SubString的时候自然会报方法不匹配的错误。 - 除了类型问题,你写的两个处理函数逻辑本身就不对:
remove_time_from拿"0 "当分隔符完全不符合你的数据格式——你的时间戳是MM:SS格式,后面跟的是普通空格,根本没有「0后面跟空格」的固定规律,遇到25:31这种结尾不是0的时间戳,切割会完全失效,直接返回整行内容。
修改方法
调整两个核心问题即可:
- 把函数的参数类型从
String改成AbstractString,兼容Julia所有字符串类型(包括String、SubString),从根源避免类型不匹配的报错。 - 修正切割逻辑,匹配你实际的文本规则:开头时间戳到第一个空格为止,直接切掉第一个空格前的内容就行;末尾的studio字段从最后一个
[的位置切掉,再去掉残留的首尾空格。另外你原来的输出序号后没加空格,和你给的示例格式不一致,顺便补上。
修正后的完整可运行代码:
function remove_time_from(str::AbstractString) first_space = findfirst(' ', str) return String(strip(str[first_space+1:end])) end function remove_studio(str::AbstractString) return String(strip(first(rsplit(str, "[")))) end function main() tracks = String[] track_num = 0 for line in eachline("track-list.txt") # 跳过文件里可能存在的空行 isempty(strip(line)) && continue track_num += 1 without_time = remove_time_from(line) track_name = remove_studio(without_time) push!(tracks, "$track_num. $track_name") end open("track-list-cleaned.txt", "w") do io for line in tracks write(io, "$line\n") end end end main()
用你给的样例输入运行后,输出结果完全符合要求:
1. Yuri Kane feat Jeza – Love Comes (Original Mix) 2. Heatbeat & Quilla – Secret (Original Mix)
内容的提问来源于stack exchange,提问作者user19273273
相关产品推荐
相关产品推荐

