2017-08-07 16 views
2

我正在设计一个简单的应用程序,使用go去阅读代表客户文件格式的几种文件格式。我的第一个想法是读取每个文件行,然后解析它到一个结构。到目前为止这么好,但我需要根据它的索引来拆分每个字段。例如:使用golang解析基于位置的字符串有什么好方法?

line := "1003450020170804890000000022344" 

编号开始于位置1至位置4 = 1003 客户ID是位置5至7和与该结构中的所有其它字段。

我想知道是否有更高效的读取格式并应用于此文件行,我想为每个字段创建一些结构并具有开始和结束字段,但对我来说听起来很奇怪。

type Record struct { 
Id  int 
Date  time.Time 
Value float64 
ClientId int32 
} 

type RecordId struct { 
    Start int 
    Finish int 
    Value int 
} 

type ClientId struct { 
    Start int 
    Finish int 
    Value int32 
} 

我不知道我是否在路上,也许有更优雅的东西可以在这种情况下更好地工作。

回答

5
var a, b int 
n, err := fmt.Sscanf("1003450020170804890000000022344", "%4d%3d", &a, &b) 
if err != nil { 
    // ... 
} 

fmt.Println(a) // 1003 
fmt.Println(b) // 450 

然后你可以创建一个这些结构。

+1

只是注意:您可以先创建'Record'并通过'&rec.ID'和'&rec.CliendID'等为'FMT。 Sscanf(...)'直接。这种分配方式较少。 – TehSphinX

+0

@akond感谢您的回复,我会尝试此解决方案! – Phopes

+0

@akond这条线有时可能比这条单线更大..我不知道它是否会在这种情况下工作。 – Phopes

1

解析函数很简单,可能就足够了,而不是声明辅助数据结构。

例如,沿着线的东西:

func NewRecord(line string) (*Record, error) { 

    if len(line) < 14 { 
     return nil, fmt.Errorf("line is too short: %d", len(line)) 
    } 

    return &Record{ 
     Id: line[0:4], 
     Name: line[4:14], 
    }, nil 
} 
相关问题