js и *.tsv или первые шаги к псевдоБД на javascript
Начальник поставил задачу:
- имеем отчёт(таблица) из 1С в виде *.tsv файла(разделитель - табуляция) - написать hta с использованием именно javascript для сотрудников, который обратившись к tsv, считал бы данные и сформировал бы по ним Html документ. Есть ряд ограничений: нельзя использовать php,нет БД и сервера, нельзя задействовать для хранения данных файлик xml Как сформировать Html я уже разобрался. tf.writeline("<html><head><TITLE>Сотрудники</TITLE></head><body> Быстрый поиск: <INPUT style=FONT-WEIGHT: bold title=Искать по должности, фамилии, эл.адресу size=10>---------------TD> <TD> <TR><tr align=middle> <br> <TD align=middle>Отдел</TD> <TD ------------------</TD></TR> <TR></tr><table>"); for (i=0;i<200 ;++i ) { tf.writeline("<tr align=center>"); for (j=0;j<10 ;j++ ) { tf.writeline("<td width=10%>"+m[i][j]+"</td>"); } } tf.writeline("</table></body></html>"); tf.Close(); Это пара вариантов чтения файла и юза split() of = new ActiveXObject("Scripting.FileSystemObject"); file=of.openTextFile("C:\\projectHTA1C\\ricn016_sotr.txt", 1, true); //alert(file.readAll()) s=file; //var browser = window.navigator, s = ''; //for(k in browser) s += browser[k] + "\n"; //console.log(s); var arr = file.readAll().split(/\t/); // проходим по массиву и выводим // каждое значение for (x=0; x < arr.length; x++) { alert(+ arr[x]); } Проблема состоит в том, что я накосячил в считывании файла и возможно как-то неправильно применяю split() для разбиение содержимого tsv в массив. Подскажите пожалуйста как грамотно считать данные из файла и разбить в массив для последующей работы.:help: |
Используя javascript в hta извлечь инфу из tsv документа, split'ом разбить её в массив и используя пару функций врисовать в html.
Проблемы с извлечь и разбить |
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [js] ... ваш код... [/js] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
alert('a b c'.split(' ')); alert('a\tb\tc'.split('\t')); alert('a\tb c'.split(/\t| /)); |
Цитата:
|
Цитата:
var line = [], count = 0, fs = new ActiveXObject("Scripting.FileSystemObject"), file = fs.GetFile("test.txt"), stream = file.OpenAsTextStream(1 /* 1: read, 2: write, 8: append */, 0); while (!stream.AtEndOfStream ) line[count++] = stream.ReadLine(); stream.Close(); line.join('').split(/[\t\n]| /); ну или так: var fso = new ActiveXObject("Scripting.FileSystemObject"), file = fso.OpenTextFile("file.txt", 1, false, 0), text = file.ReadAll(), line = text.split(/[\t\n]| /); file.Close(); fso = null |
спасибо большое! попробую сделать эти способами
|
<script language="JavaScript"> var line = [], count = 0; var m=new Array(); fzo = new ActiveXObject("Scripting.FileSystemObject"); tr = fzo.CreateTextFile("testfile3.Html", true); fs = new ActiveXObject("Scripting.FileSystemObject"); file = fs.GetFile("ricn016_sotr.txt"); stream = file.OpenAsTextStream(1 /* 1: read, 2: write, 8: append */, 0); while (!stream.AtEndOfStream ) line[count++] = stream.ReadLine(); stream.Close(); for (k=0;k<count ;k++ ) { m[k]=line[k].split(/\t/); } tr.writeline("<html><head></head><body><table"); for (i=0;i<count ;i++ ) { tr.writeline("<tr align=center>"); for (j=0;j<m.length ;j++ ) { if (j!=1 & j<9) //условие на пропускание определенных столбцов { tr.writeline("<td width=10%>"+m[i][j]+"</td>"); } } } tr.writeline("</table></body></html>"); tr.Close() </script> код читает tsv файл и приводит его к табличной форме в html документе. проблема только в том, что если split встречает пустое значение в tsv он возвращает пустую строку, что приводит к смещению данных в двумерном массиве. подскажите как избавиться от этой проблемы :) |
Цитата:
|
Вложений: 4
на первых скринах таблица с пустыми ячейками и результат её обработки.
на третьем и четвертом, результат при отсутствии пустых ячеек п.с. т.к. скрины некорректно отобразились, по этой ссылке можно слить архив http://ifolder.ru/29422349 |
Monz,
У меня нет времени разбираться в вашей ситуации, оставьте сообщение с текстом который не корректно возвращается. |
не могу в текстовом виде предоставить данные
|
Цитата:
'text text ' |
дело не в секретности:) данные нормально не копипастятся. попытаюсь изобразить.
им1 |им2|им3|им4| - первая строка(шапка таблицы) 1 .. |... |3 .. |4 .. | - что типа данных(во втором столбце данных нет) 1 .. |... |3 .. |4 .. | 1 .. |... |3 .. |4 .. | 1 .. |... |3 .. |4 .. | после сплита получаем им1 |им2|им3|им4| 1 .. |3 .. |4 .. | .. | 1 .. |3 .. |4 .. | .. | 1 .. |3.. |4 .. | .. | 1 .. |3.. |4 .. | .. | т.е. данные сдвигаются влево,т.к. сплит автоматом выкидывает пустые значения |
Проверил что будет, если в документе будут ячейки с пробелами. Их сплит прекрасно воспринимает, без сдвига столбцов. Но у меня нет никакой возможности редактировать исходник с данными.......Что можно придумать???
|
Открыть блокнот, нажать tab, скопировать символ табуляции и вставить в сплит.
|
Цитата:
|
Цитата:
Цитата:
Значит либо нужно в сплите явно поставить таб как разделитель, либо делать проверку на этапе чтения файла, ну или я не так вас понял. |
Вложений: 1
У меня есть *.tsv файл, соответственно это текст разделённый табуляцией. Этот файл создается 1С-кой. Т.к. в 1С не во всех ячейках таблицы есть данные, то в *.tsv есть места где идет два знака табуляции подряд, их-то и пропускает split.
п.с. пример tsv |
Попробуйте так:
line.split(/\t+/); Вот пример: alert('tabtab|tab'.split(/\tab+/)); |
"1132 734 Баталина Анастасия Юрьевна Сектор по работе с подхостами и представительствами менеджер по работе с подхостами и представительствами 1 21.08.1980 01.03.2012 - Работает"
Если открыть tsv блокнотом, он будет выглядеть так. Сейчас я добавлю вертикальные разделители, чтобы наглядно отобразить структуру столбцов в таблице. "|1132| |734| Баталина Анастасия Юрьевна| |Сектор по работе с подхостами и представительствами| менеджер по работе с подхостами и представительствами| 1| | | | | 21.08.1980| 01.03.2012| -| |Работает|" т.е. в исходных данных есть пустые ячейки. Split выдаёт следующую структуру: "1132 |734| Баталина Анастасия Юрьевна|Сектор по работе с подхостами и представительствами|менед ер по работе с подхостами и представительствами|1|21.08.198 0| 01.03.2012|-|Работает|" Итог: мы потеряли 6 столбцов и получили ненужное смещение в массиве на 6 позиций к началу, т.е. в колонке имя, у нас будет стоять должность, а в колонке номер сотрудника будет код отдела. |
var str = "1132 734 Баталина Анастасия Юрьевна Сектор по работе с подхостами и представительствами менеджер по работе с подхостами и представительствами 1 21.08.1980 01.03.2012 - Работает"; var tab = ' '; alert(str.split(RegExp('(' + tab + '(?=' + tab + '))')).join('').split(tab).join('\n')); |
Мы никак не можем прийти к единому пониманию, что такое tsv формат.
"TSV (от англ. Tab Separated Values — значения, разделённые табуляцией) — текстовый формат для представления таблиц баз данных. Каждая запись в таблице — это строка текстового файла. Каждое поле записи отделяется от других с помощью символа табуляции, точнее горизонтальной табуляции. TSV — это форма более общего формата DSV — значения разделённые разделителем (англ.)." http://ru.wikipedia.org/wiki/TSV в tsv символ табуляции визуально не отображается, это не пробел и не пустая строка. поэтому ваш вариант проблему не может решить. |
неужели ни у кого светлой мысли не найдется???
|
Цитата:
Если тебе нужно решить задачу, то прочитай про регулярные выражения. А конкретно про \t - это символ табуляции. Не нравиться split используй match или replace Попробуй включить мозг - это место в голове, которое должно думать. Тебе давно ответили, а не хочешь делать сам иди в раздел работа и плати деньги. |
Спасибо за оказанное внимание.
|
Часовой пояс GMT +3, время: 14:06. |