I'm working on an Angular app and trying to read and parse a simple CSV file that is only 92 bytes.Surprisingly, the upload and processing takes around 15 to 20 seconds, even for such a tiny file.
Here's the function I'm using:
upload() { const fileInput = document.createElement("input"); fileInput.type = "file"; fileInput.accept = ".csv"; this.isLoading = true; fileInput.addEventListener("change", (event) => { const target = event.target as HTMLInputElement; if (target.files?.length) { const file = target.files[0]; this.processUploadedFile(file); } }); fileInput.click();}private processUploadedFile(file: File) { this.uploadedFileName = file.name; if (file.type === "text/csv" || file.name.endsWith(".csv")) { const reader = new FileReader(); reader.onloadend = (e) => { const contents = e.target?.result as string; if (contents) { this.parseCSVData(contents); } }; reader.readAsText(file); } else { this.toast.danger("Please upload a valid CSV file."); }}private parseCSVData(csvData: string) { const lines = csvData.split("\n").filter((line) => line.trim() !== ""); const parsedData: Product[] = lines.slice(2).map((line, index) => { const values = line.split(";"); return { position: index + 1, height: parseInt(values[0]) || 0, diameter: parseInt(values[1]) || 0, li: parseInt(values[2]) || 0, lt: parseInt(values[3]) || 0, }; }); if (parsedData.length) { this.dataSource = parsedData; } this.isLoading = false;}
<button mat-flat-button aria-label="Upload data" (click)="upload()"><mat-icon>upload</mat-icon><span>Upload data</span></button>
I've tried:
- Using
FileReader.readAsText()
as shown above - Switching to PapaParse, but the delay still happens
- Confirmed the CSV file is only 92 bytes, with just 3 lines of simple numeric data
- Verified the browser's performance tab (no major CPU or memory usage)
- Tried on different browsers (Chrome, Edge) — same result