A CSV Is Not a Database Until Everyone Depends on It
There is a point in almost every technical project where somebody says, “It is just a CSV file.”
That is usually the moment the CSV begins its journey toward becoming critical infrastructure.
I use CSV files for practical reasons. They are easy to create, easy to review, and easy to feed into PowerShell or Python. For bulk work, they are often the simplest bridge between what people understand and what an API expects.
Need to assign phone numbers to a group of users? CSV.
Need to compare accounts from two systems? CSV.
Need to export results so someone can see which changes worked and which failed? Another CSV.
The problem is not the format. The problem is what happens around it.
A file called users-final.csv becomes users-final-new.csv, then users-final-new2.csv, then users-final-new2-USE-THIS.csv. Three months later, nobody knows which one produced the actual changes.
This is why I like treating scripts as real projects even when they start small.
Put the code in Git.
Use clear folders.
Keep sample input separate from real data.
Write a README that explains what the script does, what modules it needs, what permissions it expects, and what the output means.
Do not put passwords, tokens, or sensitive exports in the repository.
That last one should not need to be said, but again, the internet has taught us things.
A local Git repository is still useful even when the department does not have a shared server ready. Git is not only about publishing code to the internet. It gives you history. It shows what changed. It lets you create a branch before trying something risky. It gives you a way back when the “small cleanup” turns into a two-hour investigation.
Cross-platform scripting adds another layer.
Windows and macOS do not use the same path format, but PowerShell can handle that cleanly. Build paths with the tools PowerShell provides instead of hard-coding C:\Users\Someone\Desktop into every script. Use the user’s home directory. Validate that the input file exists. Create output folders when needed. Stop with a useful error instead of producing an empty file and pretending everything went well.
The script should also log what it changed.
Not because you expect failure, but because future you deserves evidence.
Good automation is not code that runs once on your laptop. It is code that can be understood, repeated, reviewed, and handed to someone else without a thirty-minute explanation.
A CSV is not a database.
But when a CSV becomes the source for five thousand production changes, it deserves more respect than a random file sitting in Downloads.