mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-09-20 06:29:32 +02:00
fix: misc
This commit is contained in:
@@ -56,13 +56,7 @@ export default function CsvToXml({ title }: ToolComponentProps) {
|
||||
const compute = (values: InitialValuesType, input: string) => {
|
||||
if (input) {
|
||||
try {
|
||||
const xmlResult = convertCsvToXml(input, {
|
||||
delimiter: values.delimiter,
|
||||
quote: values.quote,
|
||||
comment: values.comment,
|
||||
useHeaders: values.useHeaders,
|
||||
skipEmptyLines: values.skipEmptyLines
|
||||
});
|
||||
const xmlResult = convertCsvToXml(input, values);
|
||||
setResult(xmlResult);
|
||||
} catch (error) {
|
||||
setResult(
|
||||
|
@@ -4,7 +4,7 @@ import { lazy } from 'react';
|
||||
export const tool = defineTool('csv', {
|
||||
name: 'Convert CSV to XML',
|
||||
path: 'csv-to-xml',
|
||||
icon: 'lets-icons:xml-light',
|
||||
icon: 'mdi-light:xml',
|
||||
description: 'Convert CSV files to XML format with customizable options.',
|
||||
shortDescription: 'Convert CSV data to XML format',
|
||||
keywords: ['csv', 'xml', 'convert', 'transform', 'parse'],
|
||||
|
@@ -6,19 +6,10 @@ type CsvToXmlOptions = {
|
||||
skipEmptyLines: boolean;
|
||||
};
|
||||
|
||||
const defaultOptions: CsvToXmlOptions = {
|
||||
delimiter: ',',
|
||||
quote: '"',
|
||||
comment: '#',
|
||||
useHeaders: true,
|
||||
skipEmptyLines: true
|
||||
};
|
||||
|
||||
export const convertCsvToXml = (
|
||||
csv: string,
|
||||
options: Partial<CsvToXmlOptions> = {}
|
||||
options: CsvToXmlOptions
|
||||
): string => {
|
||||
const opts = { ...defaultOptions, ...options };
|
||||
const lines = csv.split('\n').map((line) => line.trim());
|
||||
|
||||
let xmlResult = `<?xml version="1.0" encoding="UTF-8" ?>\n<root>\n`;
|
||||
@@ -27,21 +18,21 @@ export const convertCsvToXml = (
|
||||
const validLines = lines.filter(
|
||||
(line) =>
|
||||
line &&
|
||||
!line.startsWith(opts.comment) &&
|
||||
(!opts.skipEmptyLines || line.trim() !== '')
|
||||
!line.startsWith(options.comment) &&
|
||||
(!options.skipEmptyLines || line.trim() !== '')
|
||||
);
|
||||
|
||||
if (validLines.length === 0) {
|
||||
return `<?xml version="1.0" encoding="UTF-8" ?>\n<root></root>`;
|
||||
}
|
||||
|
||||
if (opts.useHeaders) {
|
||||
headers = parseCsvLine(validLines[0], opts);
|
||||
if (options.useHeaders) {
|
||||
headers = parseCsvLine(validLines[0], options);
|
||||
validLines.shift();
|
||||
}
|
||||
|
||||
validLines.forEach((line, index) => {
|
||||
const values = parseCsvLine(line, opts);
|
||||
const values = parseCsvLine(line, options);
|
||||
xmlResult += ` <row id="${index}">\n`;
|
||||
headers.forEach((header, i) => {
|
||||
xmlResult += ` <${header}>${values[i] || ''}</${header}>\n`;
|
||||
|
Reference in New Issue
Block a user