Advertisement
DenCoder618

Untitled

Jul 4th, 2023
1,545
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.31 KB | Source Code | 0 0
  1. package MTL
  2.  
  3. import (
  4.     "encoding/csv"
  5.     "errors"
  6.     "fmt"
  7.     "github.com/kak-tus/nan"
  8.     "golang.org/x/text/encoding/charmap"
  9.     "io"
  10.     "os"
  11.     "reflect"
  12.     "strconv"
  13.     "strings"
  14.     "time"
  15. )
  16.  
  17. var (
  18.     NullStrType  = reflect.TypeOf(nan.NullString{})
  19.     NullIntType  = reflect.TypeOf(nan.NullInt{})
  20.     NullTimeType = reflect.TypeOf(nan.NullTime{})
  21. )
  22.  
  23. type Row struct {
  24.     Code                      nan.NullString
  25.     Number                    nan.NullInt
  26.     TransactionGroupID        nan.NullInt
  27.     TransactionNumber         nan.NullInt
  28.     AuthorizationNumber       nan.NullInt
  29.     TransactionPairNumber     nan.NullInt
  30.     TransactionTypeBO         nan.NullString
  31.     TransactionTypeFE         nan.NullString
  32.     AccountNumber             nan.NullString
  33.     CardNumber                nan.NullString
  34.     LocalDateTime             nan.NullTime
  35.     TransactionDateTime       nan.NullTime
  36.     TransactionDirection      nan.NullString
  37.     TransactionCurrency       nan.NullInt
  38.     SettlementCurrency        nan.NullInt
  39.     AccountCurrency           nan.NullInt
  40.     TransactionAmount         nan.NullInt
  41.     SettlementAmount          nan.NullInt
  42.     AccountAmount             nan.NullInt
  43.     MerchantID                nan.NullString
  44.     MerchantName              nan.NullString
  45.     MerchantLocation          nan.NullString
  46.     TransactionCountry        nan.NullString
  47.     TransactionState          nan.NullString
  48.     TransactionCity           nan.NullString
  49.     TransactionPostalCode     nan.NullString
  50.     TerminalID                nan.NullString
  51.     AuthorizationApprovalCode nan.NullString
  52.     EffectiveDate             nan.NullTime
  53.     SettlementDate            nan.NullTime
  54.     CorrespondingAccount      nan.NullString
  55.     MerchantCategoryCode      nan.NullString
  56.     AcquirerReferenceNumber   nan.NullInt
  57.     RetrievalReferenceNumber  nan.NullString
  58.     TransactionChannel        nan.NullString
  59.     AuthorizationCondition    nan.NullString
  60.     Description               nan.NullString
  61.     ExtendedTransactionCity   nan.NullString
  62.     TermNum                   nan.NullString
  63.     AuthorizationData         nan.NullString // nan.NullInt
  64.     ServiceID                 nan.NullString
  65.     AdditionalData            nan.NullString
  66. }
  67.  
  68. type Mtl []Row
  69.  
  70. func parseRow(arr []string) (Row, error) {
  71.     row := Row{}
  72.     rowValues := reflect.ValueOf(&row).Elem()
  73.     //ut := reflect.TypeOf(row).Elem()
  74.  
  75.     for i, value := range arr {
  76.         if value == "" {
  77.             continue
  78.         }
  79.  
  80.         fieldValue := rowValues.Field(i)
  81.         // validate fieldValue
  82.         if !(fieldValue.IsValid() && fieldValue.CanSet()) {
  83.             return Row{}, errors.New("can't validate field: " + fieldValue.Type().Name())
  84.         }
  85.         // parse value
  86.         fmt.Println(fieldValue.Kind(), fieldValue.Type().Name())
  87.  
  88.         switch fieldValue.Type() {
  89.         case NullStrType:
  90.             fieldValue.Set(reflect.ValueOf(nan.String(value)))
  91.         case NullIntType:
  92.             intValue, err := strconv.Atoi(value)
  93.             if err != nil {
  94.                 return Row{}, err
  95.             }
  96.             fieldValue.Set(reflect.ValueOf(nan.Int(intValue)))
  97.         case NullTimeType:
  98.             fieldValue.Set(reflect.ValueOf(nan.Time(time.Now())))
  99.         default:
  100.             return Row{}, errors.New("wtf, your field's Kind is " + fieldValue.Type().Name())
  101.         }
  102.         //  TODO: one fieldValue.Set(reflect.ValueOf for any type (after switch)
  103.         //  TODO: validation
  104.     }
  105.  
  106.     return row, nil
  107. }
  108.  
  109. func parseMtlFile(path string) (Mtl, error) {
  110.     content, err := readFileWin1251(path)
  111.     if err != nil {
  112.         return nil, err
  113.     }
  114.  
  115.     r := csv.NewReader(strings.NewReader(content))
  116.     r.Comma = ';'
  117.     r.LazyQuotes = true
  118.     r.FieldsPerRecord = -1
  119.  
  120.     records, err := r.ReadAll()
  121.     if err != nil {
  122.         return nil, err
  123.     }
  124.  
  125.     for i, line := range records {
  126.         if i == 0 {
  127.             continue
  128.         }
  129.         row, err := parseRow(line)
  130.         if err != nil {
  131.             return nil, err
  132.         }
  133.         fmt.Println(len(line), line)
  134.         fmt.Printf("%+v\n", row)
  135.     }
  136.  
  137.     // var to store file rows
  138.     var mtl Mtl
  139.  
  140.     return mtl, nil
  141. }
  142.  
  143. func readFileWin1251(path string) (string, error) {
  144.     // Декодировка в UTF-8
  145.     file, err := os.Open(path)
  146.     if err != nil {
  147.         return "", err
  148.     }
  149.  
  150.     defer func(f *os.File) {
  151.         err := f.Close()
  152.         if err != nil {
  153.             panic(err)
  154.         }
  155.     }(file)
  156.  
  157.     decoder := charmap.Windows1251.NewDecoder()
  158.     reader := decoder.Reader(file)
  159.     bytes, err := io.ReadAll(reader)
  160.     if err != nil {
  161.         panic(err)
  162.     }
  163.  
  164.     return string(bytes), nil
  165. }
  166.  
  167. func TestMtlParser() {
  168.     path := "source/MTL20200807_0003.0001"
  169.  
  170.     _, err := parseMtlFile(path)
  171.     if err != nil {
  172.         panic(err)
  173.     }
  174. }
  175.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement