在 Go 中解析 M3U 文件以获取数据和流

问题描述 投票:0回答:1

我正在自学一些 Go(最后),在此过程中,我尝试从本地文件为自己编写一个 M3U 解析器。

每个文件包含 2 行流分组...

第一行是包含所有正确 M3u 属性的数据,第二行是流本身的 URl。

我想做的是创建一个结构来将这个“数据”存储在2个字段中

// our m3u line structure
type M3UStructure struct {

    data    string
    stream  string

}

因此,我想出了以下方法来逐行读取 M3U 文件,并抓取每 2 行,跳过潜在的空白行。

// open the file for reading
_file, err := os.Open( _the_file )
if err != nil {

    // log
    log.Fatalf( "[ERROR] Opening File: %v", err )

    // return the error
    return err

}

// close it
defer _file.Close( )

// setup a scanner
_scanner := bufio.NewScanner( _file )
if err := _scanner.Err(); err != nil {

    // log
    log.Fatalf( "[ERROR] Reading File: %v", err )

    // return the error
    return err

}

// hold the lines we'll need
_lines := []types.M3UStructure{}

// hold an index
_idx := 0

// loop over the scan
for _scanner.Scan( ) {

    // hold the line
    _line := _scanner.Text( )

    // hold the line fields
    _line_fields := strings.Fields( _line )

    // if the line is not blank
    if _line != "" {

        // if the line is the second line
        if _idx % 2 == 0 {

            // store the url
            _lines = append( _lines, string{"stream" : _line_fields[0]} )

            //log.Printf( "[INFO] Line - STREAM: %v", _line )

        // otherwise
        } else {

            // append the data
            _lines = append( _lines, string{"data" : _line_fields[0]} )

            //log.Printf( "[INFO] Line - DATA: %v", _line )

        }


    }

    //log.Printf( "[DEBUG] FIELDS: %v", _line_fields )

    // increment the index
    _idx ++

}

log.Printf( "[DEBUG] LINES: %v", _lines )

这不起作用,把我

invalid composite literal type string
扔到
append
线上。

我很困惑...如何将每个“线对”中的第一行添加到结构的

data
值,然后将第二行添加到结构的
stream
值?以
data
stream
的有效结构列表结尾? (我现在想做的就是证明我拥有它......一旦可以,我计划稍后进一步解析该结构的数据)

go struct
1个回答
0
投票

Append 实际上不是这样工作的。

                _lines = append(_lines, M3UStructure{stream: _line_fields[0]})

您必须创建在

var lines []structure
中声明的结构。 所以

            if _idx%2 == 0 {
                _lines = append(_lines, M3UStructure{stream: _line_fields[0]})
            } else {
                _lines = append(_lines, M3UStructure{data: _line_fields[0]})

            }

效果很好。 https://go.dev/play/p/D40vmsXRR6g 嘟嘟

© www.soinside.com 2019 - 2024. All rights reserved.