Eu escrevi um script Python e um script Bash que deve fazer o que você quiser.
Solução Python
Aqui está um script Python que converte todos os campos de tempo de um formato para outro, conforme especificado na pergunta:
#!/usr/bin/env python3
# -*- coding: ascii -*-
"""reformat_time.py
Change date format from:
MM/DD/YYYY HH:MM:SS am/pm
to:
YYYY-MM-DD HH:MM:SS
in a CSV file
"""
import csv
from datetime import date
from datetime import datetime
import sys
# Open the file (taken as a command-line argument)
with open(sys.argv[1], 'r') as csvfile:
# Parse the CSV data
csvreader = csv.reader(csvfile, delimiter=',', quotechar='"')
# Iterate over the rows
for row in csvreader:
# Iterate over the columns of each row
for index, col in enumerate(row):
# Try to parse and convert each column
try:
_datetime = datetime.strptime(col, "%m/%d/%Y %H:%M:%S %p")
newcol = _datetime.strftime("%Y-%m-%d %H:%M:%S")
# If parsing fails, leave the column unchanged
except ValueError:
newcol = col
# Update the column value
row[index] = newcol
# Output the updated row
print(','.join(row))
Suponha que seu arquivo CSV seja chamado de data.csv
e contenha a seguinte linha (tirada de sua postagem):
Victor,5555555,12/6/2013 10:26:32 AM,Colosseum,1,12/8/2013 1:05:45 PM
Então você pode executar o script assim:
python reformat_time.py data.csv
Isso produziria a seguinte saída:
Victor,5555555,2013-12-06 10:26:32,Colosseum,1,2013-12-08 01:05:45
Solução de bash
E aqui está um script Bash usando o utilitário GNU date
que tem (quase) o mesmo efeito:
#!/bin/bash
# reformat_time.sh
# Loop over the lines of the file
while read -r line; do
# Extract the field values for each row
Name="$(echo ${line} | cut -d, -f1)";
Phone="$(echo ${line} | cut -d, -f2)";
SalesDate="$(echo ${line} | cut -d, -f3)";
Venue="$(echo ${line} | cut -d, -f4)";
NoOfUnits="$(echo ${line} | cut -d, -f5)";
ModifiedDate="$(echo ${line} | cut -d, -f6)";
# Convert the time-fields from the old format to the new format
NewSalesDate="$(date -d "${SalesDate}" "+%Y-%m-%d %H:%M:%S")";
NewModifiedDate="$(date -d "${ModifiedDate}" "+%Y-%m-%d %H:%M:%S")";
# Output the updated row
echo "${Name},${Phone},${NewSalesDate},${Venue},${NoOfUnits},${NewModifiedDate}";
done < "$1"
Você pode executá-lo assim:
bash reformat_time.sh data.csv
E produziria a seguinte saída:
Victor ,5555555 ,2013-12-06 10:26:32, Colosseum ,1 ,2013-12-08 13:05:45
Observe que o script do Bash é muito mais frágil. Ele não faz nenhum tratamento de erros e afeta apenas os campos 3 e 6. Ele também preserva o espaço em branco em torno do separador de campo, o qual o script Python acima não faz.