使用 JavaScript 处理和重新排列纯文本嵌套列表
Using JavaScript to process and rearrange a plain text nested list
我有一个包含嵌套项目列表的纯文本数据文件,如下所示:
Group: Folder
Group: Subfolder1
Group: Subfolder2
Group: Folder2
Group: Subfolder1
Group: NestedSubfolder1
...等等。 (每个文件夹名称在列表中自动添加 "Group: " ;文件夹也没有命名结构或约定,我将它们标记为 try 以避免复杂化示例)此文件经常更新,因此无法手动修改它,而且我无法控制输出的方式 arranged/formatted。
我正在使用的读取此文件的应用程序将其处理为大量(源代码大约有四千行)单行文本,没有换行符或 separators/delimiters,所以它最终看起来像这样:
Group: Folder Group: Subfolder1 Group: Subfolder2 Group: Folder2 Group: Subfolder1 Group: NestedSubfolder
现在,这是我的问题。为了使用它需要格式化的方式是这样的:
Folder/Subfolder1
Folder/Subfolder2
Folder2/Subfolder1/NestedSubfolder1
对于我的正常用例,RegEx 或其他一些巧妙的过滤可以让我获得我需要的信息,但由于它没有定界符、换行符或分隔符,并且需要将文本复制并智能地粘贴到位自动地,我有点不知所措。用于解析此数据并对其执行操作的应用程序可以 运行 JavaScript (Rhino) scriptlet,因此理论上可以让应用程序 运行 将输出转换为脚本格式正确、可用的纯文本。但是,我还(完全)不精通 JS;有没有人必须处理类似的任务,或者有什么聪明的想法来处理这种类型的列表,以便每个项目都包含它的完整路径?
这是一个Fiddlehttp://jsfiddle.net/362oapjk/1/
<!DOCTYPE html>
<html>
<script src='http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script>
<script>
//on window load:
window.onload = function() {
//save input text into variable toBeParsed
//we wrap the <pre> tag to make sure variable text keeps all spaces/line breaks
var toBeParsed = "<pre> " + $("#input").html() + " </pre>";
//these next lines replace groups of space using regEx
//to format the text
toBeParsed = toBeParsed.replace( /(\s{20}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{16}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{12}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{8}Group:\s)/g , "\");
var parsed = toBeParsed.replace( /(\s{4}Group:\s)/g, "\n");
//insert parsed text into output section
$("#output").html(parsed);
}
</script>
<pre><section id="input">
List of Folders
</section></pre>
<section id="output">
</section>
</html>
您将文本粘贴到 "input"
部分
当您打开网页时,它会采用预格式化的输入文本并像这样解析:
- 任何前面有 20 个空格的匹配项 "Group: " 替换为“\”。
- 任意匹配 "Group: " 前面的 16 个空格替换为“\”。
- 任意匹配 "Group: " 前面的 12 个空格替换为“\”。
- 任何前面有 8 个空格的匹配 "Group: " 替换为“\”。
- 任何前面有 4 个空格的匹配项 "Group: " 替换为“\n”(换行符)。
顺序很重要,因为这些都是 4 的间隔。原因是,作为理解概念的假示例,如果您要解析 8 之前的 4 个空格,它会将其识别为 2 组4 而不是 8。
这也意味着它取决于最长的子文件夹字符串是什么。此代码允许最多 4 个子文件夹。如果您需要更多,您将需要添加额外的正则表达式替换。 A.E。这是现在的代码:
toBeParsed = toBeParsed.replace( /(\s{20}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{16}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{12}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{8}Group:\s)/g , "\");
var parsed = toBeParsed.replace( /(\s{4}Group:\s)/g, "\n");
要添加第五个子文件夹,您需要添加另外一行并用额外的 4 个空格(从 20 到 24)进行替换,如下所示:
toBeParsed = toBeParsed.replace( /(\s{24}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{20}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{16}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{12}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{8}Group:\s)/g , "\");
var parsed = toBeParsed.replace( /(\s{4}Group:\s)/g, "\n");
此外,由于字符串中的第一个 "Group: Folder" 之前没有空格,您可以在输入部分的开头添加 4 个空格以获得干净的结果。 A.E。
//without spaces:
<pre><section id="input">Group: Folder Group: SubFolder Group: Folder2</section></pre>
//with spaces
<pre><section id="input"> Group: Folder Group: SubFolder Group: Folder2</section></pre>
这应该就可以了。
我有一个包含嵌套项目列表的纯文本数据文件,如下所示:
Group: Folder
Group: Subfolder1
Group: Subfolder2
Group: Folder2
Group: Subfolder1
Group: NestedSubfolder1
...等等。 (每个文件夹名称在列表中自动添加 "Group: " ;文件夹也没有命名结构或约定,我将它们标记为 try 以避免复杂化示例)此文件经常更新,因此无法手动修改它,而且我无法控制输出的方式 arranged/formatted。
我正在使用的读取此文件的应用程序将其处理为大量(源代码大约有四千行)单行文本,没有换行符或 separators/delimiters,所以它最终看起来像这样:
Group: Folder Group: Subfolder1 Group: Subfolder2 Group: Folder2 Group: Subfolder1 Group: NestedSubfolder
现在,这是我的问题。为了使用它需要格式化的方式是这样的:
Folder/Subfolder1
Folder/Subfolder2
Folder2/Subfolder1/NestedSubfolder1
对于我的正常用例,RegEx 或其他一些巧妙的过滤可以让我获得我需要的信息,但由于它没有定界符、换行符或分隔符,并且需要将文本复制并智能地粘贴到位自动地,我有点不知所措。用于解析此数据并对其执行操作的应用程序可以 运行 JavaScript (Rhino) scriptlet,因此理论上可以让应用程序 运行 将输出转换为脚本格式正确、可用的纯文本。但是,我还(完全)不精通 JS;有没有人必须处理类似的任务,或者有什么聪明的想法来处理这种类型的列表,以便每个项目都包含它的完整路径?
这是一个Fiddlehttp://jsfiddle.net/362oapjk/1/
<!DOCTYPE html>
<html>
<script src='http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script>
<script>
//on window load:
window.onload = function() {
//save input text into variable toBeParsed
//we wrap the <pre> tag to make sure variable text keeps all spaces/line breaks
var toBeParsed = "<pre> " + $("#input").html() + " </pre>";
//these next lines replace groups of space using regEx
//to format the text
toBeParsed = toBeParsed.replace( /(\s{20}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{16}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{12}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{8}Group:\s)/g , "\");
var parsed = toBeParsed.replace( /(\s{4}Group:\s)/g, "\n");
//insert parsed text into output section
$("#output").html(parsed);
}
</script>
<pre><section id="input">
List of Folders
</section></pre>
<section id="output">
</section>
</html>
您将文本粘贴到 "input"
部分当您打开网页时,它会采用预格式化的输入文本并像这样解析:
- 任何前面有 20 个空格的匹配项 "Group: " 替换为“\”。
- 任意匹配 "Group: " 前面的 16 个空格替换为“\”。
- 任意匹配 "Group: " 前面的 12 个空格替换为“\”。
- 任何前面有 8 个空格的匹配 "Group: " 替换为“\”。
- 任何前面有 4 个空格的匹配项 "Group: " 替换为“\n”(换行符)。
顺序很重要,因为这些都是 4 的间隔。原因是,作为理解概念的假示例,如果您要解析 8 之前的 4 个空格,它会将其识别为 2 组4 而不是 8。
这也意味着它取决于最长的子文件夹字符串是什么。此代码允许最多 4 个子文件夹。如果您需要更多,您将需要添加额外的正则表达式替换。 A.E。这是现在的代码:
toBeParsed = toBeParsed.replace( /(\s{20}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{16}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{12}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{8}Group:\s)/g , "\");
var parsed = toBeParsed.replace( /(\s{4}Group:\s)/g, "\n");
要添加第五个子文件夹,您需要添加另外一行并用额外的 4 个空格(从 20 到 24)进行替换,如下所示:
toBeParsed = toBeParsed.replace( /(\s{24}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{20}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{16}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{12}Group:\s)/g, "\");
toBeParsed = toBeParsed.replace( /(\s{8}Group:\s)/g , "\");
var parsed = toBeParsed.replace( /(\s{4}Group:\s)/g, "\n");
此外,由于字符串中的第一个 "Group: Folder" 之前没有空格,您可以在输入部分的开头添加 4 个空格以获得干净的结果。 A.E。
//without spaces:
<pre><section id="input">Group: Folder Group: SubFolder Group: Folder2</section></pre>
//with spaces
<pre><section id="input"> Group: Folder Group: SubFolder Group: Folder2</section></pre>
这应该就可以了。