-1

I have csv files that I cannot edit from another program. I want ot split the file by the sign ";" using the split function.

1: I open the csv file 2: I use readlines() 3: I use split (;) 4. ERROR when trying to read out splitted value da_split[2] (1 dimensional array is returned)

Code:

`    def get_data_csv(self):

        data = []
        
        f = open("./filename.csv", 'r')
        data = f.readlines()

        print('Printout before splitting:')
        print(data)
        data1 = data

        for da in data1:
            da_split = []
            da_split = da.split(";")
            print("Splitted: ")
            print(da_split)

            self.list_date.append(da_split[0])
            self.list_tempAS.append(self.changeStrtoFloat(da_split[1]))`

Output:

Program Start
Printout before splitting:
['Vorbereitung\n', 'Datum;Uhrzeit;Phase;Screen;Key;Interruptions;Temperatur AS;Temperatur SS;Gewichtswerte AS;Gewichtswerte SS;Info/Comment;\n', 'Nov 18;12:59:06;;;;;;;5613.74g;;;\n', 'Nov 18;12:59:01;;;;;;;5630.78g;;;\n', 'Nov 18;12:59:00;;;;;;;;5657.81g;;\n', 'Nov [...]

Splitted: 
['Vorbereitung\n']
Traceback (most recent call last):
  File "C:\Users\sp7820\PycharmProjects\graphLogger\main.py", line 99, in <module>
    main()
  File "C:\Users\sp7820\PycharmProjects\graphLogger\main.py", line 96, in main
    x.get_data_csv()
  File "C:\Users\sp7820\PycharmProjects\graphLogger\main.py", line 44, in get_data_csv
    self.list_tempAS.append(self.changeStrtoFloat(da_split[1]))
IndexError: list index out of range

Process finished with exit code 1

I tried the str() method but it didn't work anything

  • The first line of your data doesn't contain a semicolon, therefore splitting it on semicolons only produces one item. Either discard that line (I assume it's a header line that will always be present in the file), or check the length of the list before trying to use it. – jasonharper May 02 '23 at 16:56
  • With your help I was able to solve it. I had to add checkers for length and if it is convertable to numbers or not – schnecktec May 02 '23 at 17:40
  • I tried the csv library and it gave me even better results, thanks again. – schnecktec May 02 '23 at 18:08

1 Answers1

0
Printout before splitting:
  ['Vorbereitung\n',
   'Datum;Uhrzeit;Phase;Screen;Key;Interruptions;Temperatur AS;Temperatur SS;Gewichtswerte AS;Gewichtswerte SS;Info/Comment;\n',
   'Nov 18;12:59:06;;;;;;;5613.74g;;;\n',
   'Nov 18;12:59:01;;;;;;;5630.78g;;;\n',
   'Nov 18;12:59:00;;;;;;;;5657.81g;;\n',
   'Nov [...]

Your first line has no ; in it, therefore splitting it produces just one entry.

You may want to add a check for len(da_split) to omit such lines automatically:

    for da in data1:
        da_split = []
        da_split = da.split(";")
        print("Splitted: ")
        print(da_split)

        if len(da_split) >= 2:
            self.list_date.append(da_split[0])
            self.list_tempAS.append(self.changeStrtoFloat(da_split[1]))

Another option is to use the built-in csv library which avoids doing manual splitting:

    import csv
    f = open("./filename.csv", 'r')
    data = list(csv.reader(f, delimiter=';'))

giving data of:

   [
     ['Vorbereitung'],
     ['Datum', 'Uhrzeit', 'Phase', 'Screen', 'Key', 'Interruptions', 'Temperatur AS', 'Temperatur SS', 'Gewichtswerte AS', 'Gewichtswerte SS', 'Info/Comment', ''],
     ['Nov 18', '12:59:06', '', '', '', '', '', '', '5613.74g', '', '', '']
     ...
   ]
jpa
  • 10,351
  • 1
  • 28
  • 45