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 }