AR-converter

by Stalk

HTML

Образец CSV:
<pre>1;1111;ааааа;жалобы на боль за грудиной, головокружение, боль в правой руке.
2;2222;ббббб;повышение температуры тела до 38,7С, озноб, сыпь
3;3333;ввввв;Отеки голеней, папулезная сыпь на нижних конечностях</pre><hr>
<div id="dz_wrapper">
  <h3>Затащи CSV файл</h3>
  <span class="size"></span><br>
  <span class="date"></span>
  <input type="file" id="drop_zone">
</div>
<textarea id="from" placeholder="... или вставь CSV сюда"></textarea>
<br><input type="button" id="copy" value="Копировать результат в буфер">
<input type="button" id="save" value="Сохранить файл"><br>
<textarea id="to" rows="30" style="width: 95%;"></textarea>
<a href="" style="display: none" id="a"></a>

CSS

#dz_wrapper {
    width: 200px;
    height: 200px;
    float: left;
    background: #EEE;
    border: dashed 10px #CCC;
    padding: 2em;
    box-sizing: border-box;
    position: relative;
    text-align: center;
    color: #777;
    overflow: hidden;
}
#dz_wrapper h3, #dz_wrapper span {
    color: inherit;
}

#drop_zone {
    opacity: 0;
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
    margin: 0;
}

textarea, input, div {
    margin: 10px;
}
#from {
    width: calc(95% - 220px);
    height: 194px;
}

JavaScript

let splitColNumber = 3, // zero based!
    colSeparator = ';',
    rowSeperator = "\n",
    LLT_separator = ', ',
    file_name = document.querySelector('#dz_wrapper h3'),
    file_size = document.querySelector('#dz_wrapper .size'),
    file_date = document.querySelector('#dz_wrapper .date'),
    reader = new FileReader(),
    fileName = '';

from.oninput = convert
copy.onclick = copyToBuffer
reader.onload = fileLoadHandler
reader.onerror = console.log
drop_zone.onchange = fileDropHandler
save.onclick = saveFile

function convert() {
  let srcRows = from.value.trim().split(rowSeperator)
  let resultRows = []

  if (typeof srcRows == 'object') {
    srcRows.forEach(row=>{
      let srcCells = row.split(colSeparator)
      if (typeof srcCells == 'object') {
        let targetCell = srcCells[splitColNumber] || null
        if (targetCell) {
          targetCell.split(LLT_separator).forEach(value=>{
            let newRow = [...srcCells]
            newRow[splitColNumber] = value
            resultRows.push(newRow)
          })
        } else {
          to.value = 'нет колонки №' +  (splitColNumber + 1)
        }
      } else {
        to.value = 'не удалось разобрать строку на колонки'
      }
    })
  } else {
    to.value = 'не удалось разобрать файл на строки'
  }

  if (resultRows.length) {
    to.value = resultRows.map(row=>row.join(colSeparator)).join(rowSeperator)    
  }
}

function copyToBuffer() {
  to.select()
  document.execCommand('copy')
}

function fileDropHandler() {
  let file = this.files[0] || null
  //console.log('file', file)
  if (file) {
    file_name.textContent = fileName = file.name
    file_date.textContent = new Date(file.lastModified) .toLocaleString()
    file_size.textContent = file.size + ' bytes'
    reader.readAsText(file, 'windows-1251')
  }
}

function fileLoadHandler(evt) {
  from.value = evt.target.result
  convert()
}

function saveFile() {
  let blob = new Blob([to.value], {type: "text/csv"}),
      url =...