Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   js и *.tsv или первые шаги к псевдоБД на javascript (https://javascript.ru/forum/offtopic/26650-js-i-%2A-tsv-ili-pervye-shagi-k-psevdobd-na-javascript.html)

Monz 16.03.2012 14:23

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:

Monz 16.03.2012 14:34

Используя javascript в hta извлечь инфу из tsv документа, split'ом разбить её в массив и используя пару функций врисовать в html.
Проблемы с извлечь и разбить

FINoM 16.03.2012 14:44

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

monolithed 16.03.2012 19:16

alert('a    b    c'.split('    '));

alert('a\tb\tc'.split('\t'));

alert('a\tb    c'.split(/\t|    /));

Monz 17.03.2012 18:39

Цитата:

Сообщение от monolithed (Сообщение 163542)
alert('a    b    c'.split('    '));

alert('a\tb\tc'.split('\t'));

alert('a\tb    c'.split(/\t|    /));

Эти примеры я видел везде где только искал. А как быть если текст берётся из файла, а не написан ручками???

monolithed 17.03.2012 19:34

Цитата:

Сообщение от Monz
А как быть если текст берётся из файла, а не написан ручками???

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

Monz 18.03.2012 09:05

спасибо большое! попробую сделать эти способами

Monz 20.03.2012 08:39

<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 он возвращает пустую строку, что приводит к смещению данных в двумерном массиве. подскажите как избавиться от этой проблемы :)

monolithed 20.03.2012 17:48

Цитата:

Сообщение от Monz
подскажите как избавиться от этой проблемы

покажите пример того что возвращается

Monz 21.03.2012 07:02

Вложений: 4
на первых скринах таблица с пустыми ячейками и результат её обработки.
на третьем и четвертом, результат при отсутствии пустых ячеек

п.с. т.к. скрины некорректно отобразились, по этой ссылке можно слить архив http://ifolder.ru/29422349

monolithed 21.03.2012 08:23

Monz,
У меня нет времени разбираться в вашей ситуации, оставьте сообщение с текстом который не корректно возвращается.

Monz 21.03.2012 08:29

не могу в текстовом виде предоставить данные

monolithed 21.03.2012 09:02

Цитата:

Сообщение от Monz
не могу в текстовом виде предоставить данные

Я не прошу вас показывать реальные данные, мне нужно видеть в каком виде приходит результат перед тес как вы его сплитите, например:

'text   text   '

Monz 21.03.2012 09:21

дело не в секретности:) данные нормально не копипастятся. попытаюсь изобразить.
им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 .. | .. |

т.е. данные сдвигаются влево,т.к. сплит автоматом выкидывает пустые значения

Monz 23.03.2012 06:19

Проверил что будет, если в документе будут ячейки с пробелами. Их сплит прекрасно воспринимает, без сдвига столбцов. Но у меня нет никакой возможности редактировать исходник с данными.......Что можно придумать???

monolithed 23.03.2012 09:46

Открыть блокнот, нажать tab, скопировать символ табуляции и вставить в сплит.

Monz 23.03.2012 13:21

Цитата:

Сообщение от monolithed (Сообщение 164521)
Открыть блокнот, нажать tab, скопировать символ табуляции и вставить в сплит.

Cо всем моим уважением, но ,по сабжу, я пытаюсь корректно обработать *.tsv файл. В связи с чем недоумеваю, глядя на ваш ответ.

monolithed 23.03.2012 15:19

Цитата:

Сообщение от Monz
Cо всем моим уважением, но ,по сабжу, я пытаюсь корректно обработать *.tsv файл. В связи с чем недоумеваю, глядя на ваш ответ.

Вы написали, что с пробелами все нормально парсится:
Цитата:

Сообщение от Monz
Проверил что будет, если в документе будут ячейки с пробелами. Их сплит прекрасно воспринимает, без сдвига столбцов.

Однако данные приходят с табуляцией, и сплит их не корректно понимает?
Значит либо нужно в сплите явно поставить таб как разделитель, либо делать проверку на этапе чтения файла, ну или я не так вас понял.

Monz 26.03.2012 11:36

Вложений: 1
У меня есть *.tsv файл, соответственно это текст разделённый табуляцией. Этот файл создается 1С-кой. Т.к. в 1С не во всех ячейках таблицы есть данные, то в *.tsv есть места где идет два знака табуляции подряд, их-то и пропускает split.

п.с. пример tsv

monolithed 26.03.2012 14:09

Попробуйте так:
line.split(/\t+/);


Вот пример:
alert('tabtab|tab'.split(/\tab+/));

Monz 28.03.2012 09:01

"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 позиций к началу, т.е. в колонке имя, у нас будет стоять должность, а в колонке номер сотрудника будет код отдела.

monolithed 28.03.2012 13:31

var str = "1132        734    Баталина Анастасия Юрьевна        Сектор по работе с подхостами и представительствами    менеджер по работе с подхостами и представительствами    1                    21.08.1980    01.03.2012    -    Работает";

var tab = '    ';
alert(str.split(RegExp('(' + tab + '(?=' + tab + '))')).join('').split(tab).join('\n'));

Monz 29.03.2012 07:16

Мы никак не можем прийти к единому пониманию, что такое tsv формат.
"TSV (от англ. Tab Separated Values — значения, разделённые табуляцией) — текстовый формат для представления таблиц баз данных. Каждая запись в таблице — это строка текстового файла. Каждое поле записи отделяется от других с помощью символа табуляции, точнее горизонтальной табуляции. TSV — это форма более общего формата DSV — значения разделённые разделителем (англ.)."
http://ru.wikipedia.org/wiki/TSV
в tsv символ табуляции визуально не отображается, это не пробел и не пустая строка. поэтому ваш вариант проблему не может решить.

Monz 04.04.2012 08:49

неужели ни у кого светлой мысли не найдется???

Gozar 04.04.2012 10:30

Цитата:

Сообщение от Monz (Сообщение 166927)
неужели ни у кого светлой мысли не найдется???

Сдать тебя психиатру.

Если тебе нужно решить задачу, то прочитай про регулярные выражения. А конкретно про \t - это символ табуляции.

Не нравиться split используй match или replace

Попробуй включить мозг - это место в голове, которое должно думать. Тебе давно ответили, а не хочешь делать сам иди в раздел работа и плати деньги.

Monz 04.04.2012 13:47

Спасибо за оказанное внимание.


Часовой пояс GMT +3, время: 14:06.