我在.txt
文件中有数据,如下所示:
04:31 Yuri Kane feat Jeza – Love Comes (Original Mix) [PREMIER]
25:31 Heatbeat & Quilla – Secret (Original Mix) [ARMADA CAPTIVATING]
它们都有这样的模式:
00:00 artist - title [studio]
我想删除时间戳和工作室,所以输出看起来像这样:
1. Yuri Kane feat Jeza – Love Comes (Original Mix)
以下是我尝试过的:
function remove_time_from(str::String)
return last(split(str,"0 "))
end
function remove_url(str::String)
return first(rsplit(str,"["))
end
function main()
tracks = String[]
local number = 0
for line in eachline("track-list.txt")
number += 1
removed_time = remove_time_from(line)
cleaned = remove_url(removed_time)
push!(tracks,"$number.$cleaned")
end
open("track-list-cleaned.txt", "w") do io
for line in tracks
write(io, "$linen")
end
end
end
main()
但它返回:
MethodError: no method matching remove_url(::SubString{String})
使用函数remove_time_from()
时,它使用返回SubString{String}
:的first()
track = "04:31 Yuri Kane feat Jeza – Love Comes (Original Mix) [PREMIER]"
println(typeof(remove_time_from(track))) # Output: SubString{String}
你有两种方法来修复它:
- 让
remove_time_from()
和remove_url()
在返回SubString
之前将其转换为String
。这样,无论您首先使用哪个函数,都会得到一个String
:
return convert(String,last(split(str,"0 ")))
- 使用
AbstractString
而不是String
作为函数参数,因为SubString
是AbstractString
的子类型:
println(SubString <: AbstractString) # Output: true
这样,无论您首先使用哪个函数,它都会接受String
(line
的变量类型)或SubString
(使用其中一个函数后得到的类型)。
建议:
- 使用
split(str,"0 ")
不会删除时间戳:
last(split("04:31 Yuri Kane feat Jeza – Love Comes (Original Mix) [PREMIER]", "0 "))
Output: 04:31 Yuri Kane feat Jeza – Love Comes (Original Mix) [PREMIER]
您需要的是chop()
,并且可以指定从head
中忽略多少字符,因此在本例中为5
(包括前导空格)。
chop(str, head = 5)
- 您不需要读入行,清洗它,然后将它存储在
Vector
中以便以后写入。您可以清理它(在一行中完成),并将其写入文件:
open("track-list-cleaned.txt", "w") do io
for line in eachline("track-list.txt")
number += 1
cleaned = (remove_url(remove_time_from(line)))
write(io, "$number.$cleanedn")
end
end
- 在阅读时使用
enumerate()
对行进行编号:
for (number,line) in enumerate(eachline("track-list.txt"))
代码:
# Using the assignment form because each function has only one line.
remove_time_from(str::AbstractString) = chop(str, head = 5)
remove_url(str::AbstractString) = first(rsplit(str," https"))
function main()
open("track-list-cleaned.txt", "w") do io
for (number,line) in enumerate(eachline("track-list.txt"))
cleaned = strip(remove_url(remove_time_from(line)))
write(io,"$number.$cleanedn")
end
end
end
main()