清理字符串时收到MethodError



我在.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}

你有两种方法来修复它:

  1. remove_time_from()remove_url()在返回SubString之前将其转换为String。这样,无论您首先使用哪个函数,都会得到一个String
return convert(String,last(split(str,"0 ")))
  1. 使用AbstractString而不是String作为函数参数,因为SubStringAbstractString的子类型:
println(SubString <: AbstractString) # Output: true

这样,无论您首先使用哪个函数,它都会接受String(line的变量类型)或SubString(使用其中一个函数后得到的类型)。

建议

  1. 使用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)
  1. 您不需要读入行,清洗它,然后将它存储在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
  1. 在阅读时使用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()

最新更新