github.com/aliyun/aliyun-oss-go-sdk@v3.0.2+incompatible/oss/select_object_read_file_test.go (about)

     1  package oss
     2  
     3  import (
     4  	"bufio"
     5  	"encoding/csv"
     6  	"encoding/json"
     7  	"io"
     8  	"os"
     9  	"regexp"
    10  	"strconv"
    11  	"strings"
    12  )
    13  
    14  func handleError(err error) error {
    15  	if err == nil {
    16  		return nil
    17  	}
    18  	return err
    19  }
    20  
    21  func readCsvLine(fileName string) (int, error) {
    22  	file, err := os.Open(fileName)
    23  	if err != nil {
    24  		return 0, err
    25  	}
    26  	defer file.Close()
    27  	rd := csv.NewReader(file)
    28  	rc, err := rd.ReadAll()
    29  	return len(rc), err
    30  }
    31  func readCsvIsEmpty(fileName string) (string, error) {
    32  	file, err := os.Open(fileName)
    33  	if err != nil {
    34  		return "", err
    35  	}
    36  	defer file.Close()
    37  	var out string
    38  	var i, index int
    39  	var indexYear, indexStateAbbr, indexCityName, indexPopulationCount int
    40  
    41  	rd := bufio.NewReader(file)
    42  	for {
    43  		line, err := rd.ReadString('\n') // read a line
    44  		if io.EOF == err {
    45  			break
    46  		}
    47  		if err != nil {
    48  			return "", err
    49  		}
    50  
    51  		sptLint := strings.Split(line, ",")
    52  		if i == 0 {
    53  			i = 1
    54  			for _, val := range sptLint {
    55  				switch val {
    56  				case "Year":
    57  					indexYear = index
    58  				case "StateAbbr":
    59  					indexStateAbbr = index
    60  				case "CityName":
    61  					indexCityName = index
    62  				case "PopulationCount":
    63  					indexPopulationCount = index
    64  				}
    65  				index++
    66  			}
    67  		} else {
    68  			if sptLint[indexCityName] != "" {
    69  				outLine := sptLint[indexYear] + "," + sptLint[indexStateAbbr] + "," + sptLint[indexCityName] + "," + sptLint[indexPopulationCount] + "\n"
    70  				out += outLine
    71  			}
    72  		}
    73  	}
    74  
    75  	return out, nil
    76  }
    77  
    78  func readCsvLike(fileName string) (string, error) {
    79  	file, err := os.Open(fileName)
    80  	if err != nil {
    81  		return "", err
    82  	}
    83  	defer file.Close()
    84  	var out string
    85  	var i, index int
    86  	var indexYear, indexStateAbbr, indexCityName, indexPopulationCount, indexMeasure int
    87  
    88  	rd := bufio.NewReader(file)
    89  	for {
    90  		line, err := rd.ReadString('\n') // read a line
    91  		if io.EOF == err {
    92  			break
    93  		}
    94  		if err != nil {
    95  			return "", err
    96  		}
    97  
    98  		//utf8Lint := ConvertToString(line,"gbk", "utf-8")
    99  		sptLint := strings.Split(line[:(len(line)-1)], ",")
   100  		if i == 0 {
   101  			i = 1
   102  			for _, val := range sptLint {
   103  				switch val {
   104  				case "Year":
   105  					indexYear = index
   106  				case "StateAbbr":
   107  					indexStateAbbr = index
   108  				case "CityName":
   109  					indexCityName = index
   110  				case "Short_Question_Text":
   111  					indexPopulationCount = index
   112  				case "Measure":
   113  					indexMeasure = index
   114  				}
   115  				index++
   116  			}
   117  		} else {
   118  			if sptLint[indexMeasure] != "" {
   119  				reg := regexp.MustCompile("^.*blood pressure.*Years$")
   120  				res := reg.FindAllString(sptLint[indexMeasure], -1)
   121  				if len(res) > 0 {
   122  					outLine := sptLint[indexYear] + "," + sptLint[indexStateAbbr] + "," + sptLint[indexCityName] + "," + sptLint[indexPopulationCount] + "\n"
   123  					out += outLine
   124  				}
   125  			}
   126  		}
   127  	}
   128  
   129  	return out, nil
   130  }
   131  
   132  func readCsvRange(fileName string, l int, r int) (string, error) {
   133  	file, err := os.Open(fileName)
   134  	if err != nil {
   135  		return "", err
   136  	}
   137  	defer file.Close()
   138  	var out string
   139  	var i, index int
   140  	var indexYear, indexStateAbbr, indexCityName, indexPopulationCount int
   141  
   142  	rd := bufio.NewReader(file)
   143  	for j := 0; j < r+1; j++ {
   144  		if j < l {
   145  			continue
   146  		}
   147  		line, err := rd.ReadString('\n') // read a line
   148  		if io.EOF == err {
   149  			break
   150  		}
   151  		if err != nil {
   152  			return "", err
   153  		}
   154  
   155  		sptLint := strings.Split(line[:(len(line)-1)], ",")
   156  		if i == 0 {
   157  			i = 1
   158  			for _, val := range sptLint {
   159  				switch val {
   160  				case "Year":
   161  					indexYear = index
   162  				case "StateAbbr":
   163  					indexStateAbbr = index
   164  				case "CityName":
   165  					indexCityName = index
   166  				case "Short_Question_Text":
   167  					indexPopulationCount = index
   168  				}
   169  				index++
   170  			}
   171  		} else {
   172  			outLine := sptLint[indexYear] + "," + sptLint[indexStateAbbr] + "," + sptLint[indexCityName] + "," + sptLint[indexPopulationCount] + "\n"
   173  			out += outLine
   174  		}
   175  	}
   176  
   177  	return out, nil
   178  }
   179  
   180  func readCsvFloatAgg(fileName string) (avg, max, sum float64, er error) {
   181  	file, err := os.Open(fileName)
   182  	if err != nil {
   183  		er = err
   184  		return
   185  	}
   186  	defer file.Close()
   187  	var i, index int
   188  	var indexDataValue int
   189  
   190  	rd := csv.NewReader(file)
   191  
   192  	for {
   193  		rc, err := rd.Read()
   194  		if io.EOF == err {
   195  			break
   196  		}
   197  		if err != nil {
   198  			er = err
   199  			return
   200  		}
   201  		if i == 0 {
   202  			i = 1
   203  			for index = 0; index < len(rc); index++ {
   204  				if rc[index] == "Data_Value" {
   205  					indexDataValue = index
   206  				}
   207  			}
   208  		} else {
   209  			if rc[indexDataValue] != "" {
   210  				s1, err := strconv.ParseFloat(rc[indexDataValue], 64)
   211  				if err != nil {
   212  					er = err
   213  					return
   214  				}
   215  				sum += s1
   216  				if s1 > max {
   217  					max = s1
   218  				}
   219  				i++
   220  			}
   221  		}
   222  	}
   223  	avg = sum / float64(i-1)
   224  	return
   225  }
   226  func readCsvConcat(fileName string) (string, error) {
   227  	var out string
   228  	file, err := os.Open(fileName)
   229  	if err != nil {
   230  		return out, err
   231  	}
   232  	defer file.Close()
   233  	var i int
   234  	var indexDataValue int
   235  	var indexYear, indexStateAbbr, indexCityName, indexShortQuestionText, indexDataValueUnit int
   236  
   237  	rd := csv.NewReader(file)
   238  
   239  	for {
   240  		rc, err := rd.Read()
   241  		if io.EOF == err {
   242  			break
   243  		}
   244  		if err != nil {
   245  			return out, err
   246  		}
   247  		if i == 0 {
   248  			for j, v := range rc {
   249  				switch v {
   250  				case "Year":
   251  					indexYear = j
   252  				case "StateAbbr":
   253  					indexStateAbbr = j
   254  				case "CityName":
   255  					indexCityName = j
   256  				case "Short_Question_Text":
   257  					indexShortQuestionText = j
   258  				case "Data_Value_Unit":
   259  					indexDataValueUnit = j
   260  				case "Data_Value":
   261  					indexDataValue = j
   262  				}
   263  			}
   264  		} else {
   265  			i++
   266  			if rc[indexDataValue] != "" || rc[indexDataValueUnit] != "" {
   267  				reg := regexp.MustCompile("^14.8.*$")
   268  				reD := reg.FindAllString(rc[indexDataValue], -1)
   269  				reDU := reg.FindAllString(rc[indexDataValueUnit], -1)
   270  				if len(reD) > 0 || len(reDU) > 0 {
   271  					outLine := rc[indexYear] + "," + rc[indexStateAbbr] + "," + rc[indexCityName] + "," + rc[indexShortQuestionText] + "\n"
   272  					out += outLine
   273  				}
   274  			}
   275  		}
   276  		i++
   277  	}
   278  	return out, nil
   279  }
   280  func readCsvComplicateCondition(fileName string) (string, error) {
   281  	var out string
   282  	file, err := os.Open(fileName)
   283  	if err != nil {
   284  		return out, err
   285  	}
   286  	defer file.Close()
   287  	var i int
   288  	var indexDataValue, indexCategory, indexHighConfidenceLimit, indexMeasure int
   289  	var indexYear, indexStateAbbr, indexCityName, indexShortQuestionText, indexDataValueUnit int
   290  
   291  	rd := csv.NewReader(file)
   292  
   293  	for {
   294  		rc, err := rd.Read()
   295  		if io.EOF == err {
   296  			break
   297  		}
   298  		if err != nil {
   299  			return out, err
   300  		}
   301  		if i == 0 {
   302  			for j, v := range rc {
   303  				switch v {
   304  				case "Year":
   305  					indexYear = j
   306  				case "StateAbbr":
   307  					indexStateAbbr = j
   308  				case "CityName":
   309  					indexCityName = j
   310  				case "Short_Question_Text":
   311  					indexShortQuestionText = j
   312  				case "Data_Value_Unit":
   313  					indexDataValueUnit = j
   314  				case "Data_Value":
   315  					indexDataValue = j
   316  				case "Measure":
   317  					indexMeasure = j
   318  				case "Category":
   319  					indexCategory = j
   320  				case "High_Confidence_Limit":
   321  					indexHighConfidenceLimit = j
   322  				}
   323  			}
   324  		} else {
   325  			reg := regexp.MustCompile("^.*18 Years$")
   326  			reM := reg.FindAllString(rc[indexMeasure], -1)
   327  			var dataV, limitV float64
   328  			if rc[indexDataValue] != "" {
   329  				dataV, err = strconv.ParseFloat(rc[indexDataValue], 64)
   330  				if err != nil {
   331  					return out, err
   332  				}
   333  			}
   334  			if rc[indexHighConfidenceLimit] != "" {
   335  				limitV, err = strconv.ParseFloat(rc[indexHighConfidenceLimit], 64)
   336  				if err != nil {
   337  					return out, err
   338  				}
   339  			}
   340  			if dataV > 14.8 && rc[indexDataValueUnit] == "%" || len(reM) > 0 &&
   341  				rc[indexCategory] == "Unhealthy Behaviors" || limitV > 70.0 {
   342  				outLine := rc[indexYear] + "," + rc[indexStateAbbr] + "," + rc[indexCityName] + "," + rc[indexShortQuestionText] + "," + rc[indexDataValue] + "," + rc[indexDataValueUnit] + "," + rc[indexCategory] + "," + rc[indexHighConfidenceLimit] + "\n"
   343  				out += outLine
   344  			}
   345  		}
   346  		i++
   347  	}
   348  	return out, nil
   349  }
   350  
   351  type Extra struct {
   352  	Address     string `json:"address"`
   353  	ContactForm string `json:"contact_form"`
   354  	Fax         string `json:"fax,omitempty"`
   355  	How         string `json:"how,omitempty"`
   356  	Office      string `json:"office"`
   357  	RssUrl      string `json:"rss_url,omitempty"`
   358  }
   359  
   360  type Person struct {
   361  	Bioguideid  string  `json:"bioguideid"`
   362  	Birthday    string  `json:"birthday"`
   363  	Cspanid     int     `json:"cspanid"`
   364  	Firstname   string  `json:"firstname"`
   365  	Gender      string  `json:"gender"`
   366  	GenderLabel string  `json:"gender_label"`
   367  	Lastname    string  `json:"lastname"`
   368  	Link        string  `json:"link"`
   369  	Middlename  string  `json:"middlename"`
   370  	Name        string  `json:"name"`
   371  	Namemod     string  `json:"namemod"`
   372  	Nickname    string  `json:"nickname"`
   373  	Osid        string  `json:"osid"`
   374  	Pvsid       *string `json:"pvsid"`
   375  	Sortname    string  `json:"sortname"`
   376  	Twitterid   *string `json:"twitterid"`
   377  	Youtubeid   *string `json:"youtubeid"`
   378  }
   379  
   380  type JsonLineSt struct {
   381  	Caucus            *string `json:"caucus"`
   382  	CongressNumbers   []int   `json:"congress_numbers"`
   383  	Current           bool    `json:"current"`
   384  	Description       string  `json:"description"`
   385  	District          *string `json:"district"`
   386  	Enddate           string  `json:"enddate"`
   387  	Extra             Extra   `json:"extra"`
   388  	LeadershipTitle   *string `json:"leadership_title"`
   389  	Party             string  `json:"party"`
   390  	Person            Person  `json:"person"`
   391  	Phone             string  `json:"phone"`
   392  	RoleType          string  `json:"role_type"`
   393  	RoleTypeLabel     string  `json:"role_type_label"`
   394  	SenatorClass      string  `json:"senator_class"`
   395  	SenatorClassLabel string  `json:"senator_class_label"`
   396  	SenatorRank       string  `json:"senator_rank"`
   397  	SenatorRankLabel  string  `json:"senator_rank_label"`
   398  	Startdate         string  `json:"startdate"`
   399  	State             string  `json:"state"`
   400  	Title             string  `json:"title"`
   401  	TitleLong         string  `json:"title_long"`
   402  	Website           string  `json:"website"`
   403  }
   404  type Metast struct {
   405  	limit      int
   406  	Offset     int
   407  	TotalCount int
   408  }
   409  
   410  type JsonSt struct {
   411  	Meta    Metast
   412  	Objects []JsonLineSt `json:"objects"`
   413  }
   414  
   415  func readJsonDocument(fileName string) (string, error) {
   416  	var out string
   417  	var data JsonSt
   418  	file, err := os.Open(fileName)
   419  	if err != nil {
   420  		return "", err
   421  	}
   422  	decoder := json.NewDecoder(file)
   423  	err = decoder.Decode(&data)
   424  	for _, v := range data.Objects {
   425  		if v.Party == "Democrat" {
   426  			lint, err := json.Marshal(v)
   427  			if err != nil {
   428  				return "", err
   429  			}
   430  			lints := strings.Replace(string(lint), "\\u0026", "&", -1)
   431  			out += lints + ","
   432  		}
   433  	}
   434  
   435  	return out, err
   436  }
   437  func readJsonLinesLike(fileName string) (string, error) {
   438  	var out string
   439  	var data JsonSt
   440  	file, err := os.Open(fileName)
   441  	if err != nil {
   442  		return "", err
   443  	}
   444  	decoder := json.NewDecoder(file)
   445  	err = decoder.Decode(&data)
   446  	reg := regexp.MustCompile("^1959.*")
   447  	for _, v := range data.Objects {
   448  		reB := reg.FindAllString(v.Person.Birthday, -1)
   449  		if len(reB) > 0 {
   450  			lints := "{\"firstname\":\"" + v.Person.Firstname + "\",\"lastname\":\"" + v.Person.Lastname + "\"}"
   451  			out += lints + ","
   452  		}
   453  	}
   454  
   455  	return out, err
   456  }
   457  
   458  func readJsonLinesRange(fileName string, l, r int) (string, error) {
   459  	var out string
   460  	var data JsonSt
   461  	var i int
   462  	file, err := os.Open(fileName)
   463  	if err != nil {
   464  		return "", err
   465  	}
   466  	decoder := json.NewDecoder(file)
   467  	err = decoder.Decode(&data)
   468  	for _, v := range data.Objects {
   469  		if i < l {
   470  			continue
   471  		}
   472  		if i >= r {
   473  			break
   474  		}
   475  		extrb, err := json.Marshal(v.Extra)
   476  		if err != nil {
   477  			return "", err
   478  		}
   479  		extr := strings.Replace(string(extrb), "\\u0026", "&", -1)
   480  
   481  		lints := "{\"firstname\":\"" + v.Person.Firstname + "\",\"lastname\":\"" + v.Person.Lastname +
   482  			"\",\"extra\":" + extr + "}"
   483  		out += lints + ","
   484  		i++
   485  	}
   486  
   487  	return out, err
   488  }
   489  
   490  func readJsonFloatAggregation(fileName string) (float64, float64, float64, error) {
   491  	var avg, max, min, sum float64
   492  	var data JsonSt
   493  	var i int
   494  	file, err := os.Open(fileName)
   495  	if err != nil {
   496  		return avg, max, min, err
   497  	}
   498  	decoder := json.NewDecoder(file)
   499  	err = decoder.Decode(&data)
   500  	for _, v := range data.Objects {
   501  		if i == 0 {
   502  			min = float64(v.Person.Cspanid)
   503  		}
   504  		if max < float64(v.Person.Cspanid) {
   505  			max = float64(v.Person.Cspanid)
   506  		}
   507  		if min > float64(v.Person.Cspanid) {
   508  			min = float64(v.Person.Cspanid)
   509  		}
   510  		sum += float64(v.Person.Cspanid)
   511  		i++
   512  	}
   513  	avg = sum / float64(i)
   514  	return avg, max, min, err
   515  }
   516  
   517  func readJsonDocumentConcat(fileName string) (string, error) {
   518  	var out string
   519  	var data JsonSt
   520  	file, err := os.Open(fileName)
   521  	if err != nil {
   522  		return "", err
   523  	}
   524  	decoder := json.NewDecoder(file)
   525  	err = decoder.Decode(&data)
   526  
   527  	for _, v := range data.Objects {
   528  		if v.Person.Firstname+v.Person.Lastname == "JohnKennedy" {
   529  			extrb, err := json.Marshal(v.Person)
   530  			if err != nil {
   531  				return "", err
   532  			}
   533  			extr := "{\"person\":" + strings.Replace(string(extrb), "\\u0026", "&", -1) + "}"
   534  			out += extr + ","
   535  		}
   536  	}
   537  
   538  	return out, err
   539  }
   540  
   541  func readJsonComplicateConcat(fileName string) (string, error) {
   542  	var out string
   543  	var data JsonSt
   544  	file, err := os.Open(fileName)
   545  	if err != nil {
   546  		return "", err
   547  	}
   548  	decoder := json.NewDecoder(file)
   549  	err = decoder.Decode(&data)
   550  
   551  	for _, v := range data.Objects {
   552  		if v.Startdate > "2017-01-01" && v.SenatorRank == "junior" ||
   553  			v.State == "CA" && v.Party == "Repulican" {
   554  			cn := "["
   555  			for _, vv := range v.CongressNumbers {
   556  				cn += strconv.Itoa(vv) + ","
   557  			}
   558  			cn = cn[:len(cn)-1] + "]"
   559  			lints := "{\"firstname\":\"" + v.Person.Firstname + "\",\"lastname\":\"" + v.Person.Lastname + "\",\"congress_numbers\":" + cn + "}"
   560  			out += lints + ","
   561  		}
   562  	}
   563  
   564  	return out, err
   565  }