import csv


def fix_turnstile_data(filenames):
    '''
    Filenames is a list of MTA Subway turnstile text files. A link to an example
    MTA Subway turnstile text file can be seen at the URL below:
    http://web.mta.info/developers/data/nyct/turnstile/turnstile_110507.txt
    
    As you can see, there are numerous data points included in each row of the
    a MTA Subway turnstile text file. 

    You want to write a function that will update each row in the text
    file so there is only one entry per row. A few examples below:
    A002,R051,02-00-00,05-28-11,00:00:00,REGULAR,003178521,001100739
    A002,R051,02-00-00,05-28-11,04:00:00,REGULAR,003178541,001100746
    A002,R051,02-00-00,05-28-11,08:00:00,REGULAR,003178559,001100775
    
    Write the updates to a different text file in the format of "updated_" + filename.
    For example:
        1) if you read in a text file called "turnstile_110521.txt"
        2) you should write the updated data to "updated_turnstile_110521.txt"

    The order of the fields should be preserved. 
    
    You can see a sample of the turnstile text file that's passed into this function
    and the the corresponding updated file in the links below:
    
    Sample input file:
    https://www.dropbox.com/s/mpin5zv4hgrx244/turnstile_110528.txt
    Sample updated file:
    https://www.dropbox.com/s/074xbgio4c39b7h/solution_turnstile_110528.txt
    '''

    
    
    
    #old code
    '''
    #final list to be printed to a file
    solution = []
    
    for name in filenames:
        with open(name, 'rb') as f:
            reader = csv.reader(f)
            for row in reader:
                # first non changing 3 elements of each row
                first_three = row[:3]

                #remove the first 3 values
                del row[:3]

                #keep removing 5 elements from row until empty
                while len(row) != 0:
                    # list of updated rows
                    updated = []

                    #add the first 3 values of this row followed by the next
                    #5 elements to form an updated row (the first 3 elements are always constant in each row)
                    #Note that i used extend here instead of append to add multiple values
                    
                    updated.extend(first_three)
                    updated.extend(row[:5])

                    #trim last entry (remove white spaces)
                    #see http://stackoverflow.com/questions/1185524/how-to-trim-whitespace-including-tabs
                    updated[-1] = updated[-1].strip(' \t\n\r')

                    #remove processed values
                    del row[:5]

                    #we have an updated row now, add it to the solution
                    solution.append(updated)

        with open("updated_" + name, 'wb') as w:
            writer = csv.writer(w)
            writer.writerows(solution)
    '''
        
    # a better and more neat code
    for name in filenames:
        with open("updated_" + name, 'wb') as fw:
            writer = csv.writer(fw)    
            with open(name, 'rb') as f:
                reader = csv.reader(f)
                for row in reader:
                    header = row[0:3]
                    index = 3
                    step = 5
                    while index < len(row):
                        writer.writerow(header + row[index:index + step])
                        index += step


