utils.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from enum import Enum
  2. class ParserState(Enum):
  3. STARTING_VALUE = 0
  4. READING_VALUE = 1
  5. ESCAPING = 2
  6. CLOSING_ESCAPE = 3
  7. def split_csv_row(raw_data, separator=",", escape='"'):
  8. state: ParserState = ParserState.STARTING_VALUE
  9. arr = []
  10. current_item = ""
  11. for c in raw_data:
  12. if state == ParserState.STARTING_VALUE:
  13. if c == escape:
  14. state = ParserState.ESCAPING
  15. elif c == separator:
  16. arr.append("")
  17. else:
  18. state = ParserState.READING_VALUE
  19. current_item = c
  20. elif state == ParserState.READING_VALUE:
  21. if c == separator:
  22. state = ParserState.STARTING_VALUE
  23. arr.append(current_item)
  24. current_item = ""
  25. else:
  26. current_item += c
  27. elif state == ParserState.ESCAPING:
  28. if c == escape:
  29. state = ParserState.CLOSING_ESCAPE
  30. else:
  31. current_item += c
  32. elif state == ParserState.CLOSING_ESCAPE:
  33. if c == escape:
  34. state = ParserState.ESCAPING
  35. current_item += c
  36. else:
  37. state = ParserState.READING_VALUE
  38. arr.append(current_item)
  39. current_item = ""
  40. arr.append(current_item)
  41. return arr
  42. if __name__ == "__main__":
  43. test_1 = 'Rangement bouffe final,"Ranger la nourriture, gérer les restes, ranger les tupperware",Anne-Gaëlle,Anne-Gaëlle,,,'
  44. print(split_csv_row(test_1))
  45. test_1 = 'Installation prépa public,Install / prépa public,","",", coucou'
  46. print(split_csv_row(test_1))
  47. test_3 = ', prépa public,","",""", coucou,'
  48. print(split_csv_row(test_3))