精华内容
下载资源
问答
  • 在python中进行数据处理,经常会遇到有些元素内容是不需要的。需要进行删除或者替换。本篇就详细探讨一下各种数据类型(series,dataframe)下的删除方法 随机创建一个DataFrame数据 import pandas as pd import numpy ...

    在python中进行数据处理,经常会遇到有些元素内容是不需要的。需要进行删除或者替换。本篇就详细探讨一下各种数据类型(series,dataframe)下的删除方法
    随机创建一个DataFrame数据

    import pandas as pd
    import numpy as np
    data=pd.DataFrame(np.random.randint(10,size=(5,3)),columns=['a','b','c'])
    >>>
    	a	b	c
    0	3	8	2
    1	9	9	5
    2	4	5	1
    3	2	7	5
    4	1	2	8
    

    Series:

    isin反函数删除不需要的列部分元素,适合大批量:
    S数据类型直接使用isin会选出该列包含的指定内容,我们的需求是删除指定内容就需要用到isin的反函数。但是python目前没有类似isnotin这种函数,所以我们需要使用-号来实现isnotin的方法
    !=比较运算符方式,适合少量或者用作与同时满足a条件与b条件的情况

    isin:
    Series的场景

    print(data['c'][data['c'].isin([1])])
    >>>
    2    1
    Name: c, dtype: int64
    
    print(data['c'][-data['c'].isin([1])])
    >>>
    0    2
    1    5
    3    5
    4    8
    Name: c, dtype: int64
    
    print(data['c'][-data['c'].isin([1,2])])
    >>>
    1    5
    3    5
    4    8
    Name: c, dtype: int64
    

    DataFrame场景:

    print(data[-data.isin([1,2])])#按Series逻辑操作df发现会出现NAN并没有删除掉
    >>>
    	a	b	c
    0	3.0	8.0	NaN
    1	9.0	9.0	5.0
    2	4.0	5.0	NaN
    3	NaN	7.0	5.0
    4	NaN	NaN	8.0
    print(data[-data.isin([1,2])].dropna())#我们只需要再加一个dropna删除空值就好了
    >>>
    a	b	c
    1	9.0	9.0	5.0
    

    !=比较运算符:
    Series的场景:

    print(data['c'][data['c']!=1])
    >>>
    0    2
    1    5
    3    5
    4    8
    Name: c, dtype: int64
    
    print(data['c'][(data['c']!=1)&((data['c']!=2))])
    >>>
    1    5
    3    5
    4    8
    Name: c, dtype: int64
    

    DataFrame场景:
    分别删除a与b不同条件的数据

    print(data[(data['a']!=1)&(data['c']!=2)]
    >>>
    	a	b	c
    1	9	9	5
    2	4	5	1
    3	2	7	5
    
    print(data[(data!=1)&(data!=2)].dropna()) #与isin原理相同
    	a	b	c
    1	9.0	9.0	5.0
    
    展开全文
  • 数据库存储里面的ID(序号)一般是自增性质的,不停的增加、删除操作后,这个序号就会乱,数字 不连续,而我们要显示到GUI里面的序号肯定需要按正常顺序显示的,本文提供构造顺序序号的方法; 操作(比如...

    问题描述

    我们在用Javafx开发应用程序的时候,TableView是比较常用的用来展示数据的控件,但是它的灵活性确实没有WEB开发里面的控件好,比如,我遇到的问题就有:

    1. 数据库存储里面的ID列(序号)一般是自增性质的,不停的增加、删除操作后,这个序号列就会乱,数字 不连续,而我们要显示到GUI里面的序号列肯定需要按正常顺序显示的,本文提供构造顺序序号列的方法;
    2. 操作列(比如删除)的渲染问题,一种思路就是在表格控件之外加一个删除按钮,点击按钮的时候判断一下当前选中的行,然后执行删除操作。本文讨论另外一种思路,单独在表格里面添加一个删除列(每行都有一个删除按钮,单击则删除所在行数据);
    3. 很多时候,我们具有个性化显示表格数据的需求,比如,显示学生数学成绩的某列,我们希望把那些低于60分的分数标红,而及格分数则不做处理;
    TableView理解

    JavaFX表格控件渲染数据主要有两种方法:
    1. setCellValueFactory(new PropertyValueFactory<>(“字段名”)),适合表格列数已知,有对应实体的情况(比如,学生信息,我们假定它只有姓名、性别、学号、地址、联系方式等固定字段,则适合采用此种方式进行渲染);
    2. setCellValueFactory(new MapValueFactory<>(“对应列的键值”)),适合表格列数在渲染之前未知,需要根据传入数据的维数确定的情况,此时因为没有固定列数,所以一般数据也没有对应的实体类,数据需要用Map进行构造,一行数据就是一个Map;
    本文主要针对列数已知的情况,Map的情况同理。

    代码DEMO
    工程目录如下图:

    这里写图片描述

    Main.java

    /**
     * 实现表格的序号列的计算填充,
     * 实现按钮操作列的正常显示以及事件绑定
     */
    package application;
    
    import java.io.IOException;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.AnchorPane;
    import javafx.stage.Stage;
    
    public class Main extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            try {
                FXMLLoader loader = new FXMLLoader();
                loader.setLocation(this.getClass().getResource("FXTable.fxml"));
                // 为表格设置控制器
                loader.setController(new TableController());
                AnchorPane rootPane = loader.load();
                Scene scene = new Scene(rootPane,506,460);
                primaryStage.sizeToScene();
                primaryStage.setScene(scene);
                primaryStage.show();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }

    Student.java

    package application;
    
    public class Student {
        private String firstName;
        private String lastName;
        private int age;
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Student(String firstName, String lastName, int age) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.age = age;
        }
    }
    

    TableController.java

    package application;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.CheckBox;
    import javafx.scene.control.Label;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.image.ImageView;
    
    public class TableController implements Initializable {
        @FXML
        private Label fxLabel;
        @FXML
        private TableView<Student> stuTable;
        @FXML
        private TableColumn<Student, String> idCol, fNameCol, lNameCol, delCol;
        @FXML
        private TableColumn<Student, Integer> ageCol;
        @FXML
        private TableColumn<Student, Boolean> isAdultCol;
    
        public ObservableList<Student> getStuData() {
    
            Student stu1 = new Student("赵", "哈", 16);
            Student stu2 = new Student("钱", "大", 26);
            Student stu3 = new Student("孙", "阿", 23);
            Student stu4 = new Student("李", "佛山", 17);
            Student stu5 = new Student("周", "阿萨德", 23);
            Student stu6 = new Student("吴", "更好", 12);
            Student stu7 = new Student("郑", "和", 28);
            Student stu8 = new Student("王", "费", 23);
            Student stu9 = new Student("刘", "的", 15);
            Student stu10 = new Student("关", "时是", 23);
            Student stu11 = new Student("张", "良好", 19);
            Student stu12 = new Student("诸葛", "列", 23);
            Student stu13 = new Student("司马", "咯跑", 20);
    
            ObservableList<Student> stuLists = FXCollections.observableArrayList(stu1, stu2, stu3, stu4, stu5, stu6, stu7,
                    stu8, stu9, stu10, stu11, stu12, stu13);
            return stuLists;
        }
    
        /**
         * 显示学生表格
         * 
         * @param stuLists
         */
        public void showStuTable(ObservableList<Student> stuLists) {
            fNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
            lNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
            // ageCol.setCellValueFactory(new PropertyValueFactory<>("age"));
            idCol.setCellFactory((col) -> {
                TableCell<Student, String> cell = new TableCell<Student, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);
    
                        if (!empty) {
                            int rowIndex = this.getIndex() + 1;
                            this.setText(String.valueOf(rowIndex));
                        }
                    }
                };
                return cell;
            });
    
            ageCol.setCellFactory((col) -> {
                TableCell<Student, Integer> cell = new TableCell<Student, Integer>() {
    
                    @Override
                    public void updateItem(Integer item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);
    
                        if (!empty) {
                            int age = this.getTableView().getItems().get(this.getIndex()).getAge();
                            this.setText(String.valueOf(age));
                            if (age < 18) {
                                this.getStyleClass().add("mark");
                            }
                        }
                    }
    
                };
                return cell;
            });
    
            isAdultCol.setCellFactory((col) -> {
                TableCell<Student, Boolean> cell = new TableCell<Student, Boolean>() {
    
                    @Override
                    public void updateItem(Boolean item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);
    
                        if (!empty) {
                            CheckBox checkBox = new CheckBox();
                            this.setGraphic(checkBox);
                            checkBox.selectedProperty().addListener((obVal, oldVal, newVal) -> {
                                if (newVal) {
                                    // 添加选中时执行的代码
                                    System.out.println("第" + this.getIndex() + "行被选中!");
                                    // 获取当前单元格的对象
                                    // this.getItem();
                                }
    
                            });
                        }
                    }
    
                };
                return cell;
            });
    
            delCol.setCellFactory((col) -> {
                TableCell<Student, String> cell = new TableCell<Student, String>() {
    
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        this.setText(null);
                        this.setGraphic(null);
    
                        if (!empty) {
                            ImageView delICON = new ImageView(getClass().getResource("delete.png").toString());
                            Button delBtn = new Button("删除", delICON);
                            this.setGraphic(delBtn);
                            delBtn.setOnMouseClicked((me) -> {
                                Student clickedStu = this.getTableView().getItems().get(this.getIndex());
                                System.out.println("删除 " + clickedStu.getFirstName() + clickedStu.getLastName() + " 的记录");
                            });
                        }
                    }
    
                };
                return cell;
            });
    
            stuTable.setItems(stuLists);
        }
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
    
            fxLabel.setWrapText(true);
            fxLabel.setText("        javafx_Label标签的换行测试,用于弹出框的提示信息测试,Label控件也可以换行。");
    
            this.showStuTable(this.getStuData());
        }
    
    }
    

    FXTable.fxml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.control.*?>
    <?import java.lang.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.layout.AnchorPane?>
    
    <AnchorPane prefHeight="461.0" prefWidth="489.0" stylesheets="@Fxtable.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
       <children>
          <TableView fx:id="stuTable" layoutY="54.0" prefHeight="407.0" prefWidth="402.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="54.0">
            <columns>
                <TableColumn fx:id="idCol" prefWidth="75.0" text="序号" />
              <TableColumn fx:id="fNameCol" prefWidth="87.0" text="姓氏" />
              <TableColumn fx:id="lNameCol" prefWidth="79.0" text="名字" />
                <TableColumn fx:id="ageCol" prefWidth="73.0" text="年龄" />
                <TableColumn fx:id="delCol" prefWidth="86.0" text="删除列" />
                <TableColumn fx:id="isAdultCol" prefWidth="88.0" text="成年?" />
            </columns>
          </TableView>
          <Label fx:id="fxLabel" layoutY="-1.0" prefHeight="56.0" prefWidth="402.0" />
       </children>
    </AnchorPane>
    运行截图:

    这里写图片描述

    这里写图片描述

    实现描述:
    1. 实体类里面无ID字段,表格做数据展示的时候临时构造顺序ID列数据;
    2. 删除操作列的渲染,并且添加单击事件,能够实时响应删除动作;
    3. 年龄一列的个性化显示,未成年年龄显示为红色字体;

    另,DEMO源码可以向我索要。

    展开全文
  • 用vi删除某一

    千次阅读 2018-08-06 17:47:28
    vi 中如何一次删除?  如:  123aaaaa  !@#aaaaa  ABCaaaaa  +-/aaaaa  在 vi 中如何一次删除前 3 呢? 最简单的方法: 1. 先ctrl-v进行visual block模式 2. 移动光标,按选择你要删除 3. 然后按x...

    vi   中如何一次删除多列? 

    如: 

    123aaaaa 
    !@#aaaaa 
    ABCaaaaa 
    +-/aaaaa 


    在   vi   中如何一次删除前   3   列呢?

    最简单的方法:
    1. 先ctrl-v进行visual   block模式

    2. 移动光标,按列选择你要删除的列

    3. 然后按x命令删除。

    具体讲,光标先移动到第一行,第一列,然后按ctrl   +   v,

    然后把光标移动到第三行,第三列,再按x键。

    就可以删除前三行前三列。

    ——————————

    Ctrl+V, G 之后再右移光标选种几列进行删除x
    如果不用G的话,可以手动自己移动光标进行选择,最后删除

    当然如果用cut和awk也是可以实现的

    比如删除第10列,

    文件有100列

    cut -d ” ” -f 1-9,11-100 urfile

    or:

    awk ‘{$10=”",print}’ urfile

     

     

     

     

    1、vi列删除

    方法一:

    ctrl+v进入列编辑模式;

    将光标定位子想要删除的起始列;

    移动光标至结束列(直接通过移动光标选中,对列不对齐时,可能比较长的行,无法全部选中,尤其是需要一直删除到行末,按end可直接到达,在列不对齐情况下也可将内容全部选择)

    方法二:

    1.定位光标;

    2.按d;

    3.按ctrl+v;

    4.按end(直接到行末)或数字+方向键(指定需删除的字符数)

    注:在第四步,按键后会直接删除选定内容。

     

    2、vi 行删除

    1、单行删除

    单行删除:1(待删除行)d

    光标所在行,dd

     

    2、多行删除

    eg:

    多行删除,删除1到10行

    :1,10d

    从某行开始至文本末尾全部删除,删除第8行至末尾

    :8,$d

     

     

     

    3、查找关键字删除

    1、删除关键字所在行

    要删除文档中含有字符reset_reg的所有行:

    :g/reset_reg/d

    会将含有reset_reg的全部行删除。

    4、删除含有某些字符的行

    :g/string/d

    eg:路径列表,删除含trash的路径

    :g/trash/d

    即可把列表中列出的含有回收站的统计的路径删除。

     

    5、删除空白行

    方法一:

    :g/^$/d

    方法二:

    :%s/^\n/s//g

    方法三:

    :g/^\n/s///g

    方法四:

    删除多行空白行,保留一行空白行

    :%s/^\n$//g

     

     

    6、删除重复行并排序

    输入如下内容:

     

    7、删除全文

     

    输入:

    :g/.*/d

    说明:.*为匹配任意单个字符。

     

    7、部分内容删除方式

    x:删除当前字符。

    dw:删除当前字。

    dd:删除当前行。

    d$:删除当前字符开始到行尾的所有字符。

    d0:删除前一个字符开始到行首的所有字符。

    ndd:删除当前行开始的连续n行。

    dH:删除从当前行到屏幕首行的内容。

    dM:删除从当前行到屏幕中间行的内容。

    dL:删除从当前行到屏幕末行的内容。

     

     

    可视模式让你可以选择文件的一部分内容,以便作比如删除,复制等工作。

    进入可视模式

    v

    用v命令进入可视模式。当光标移动时,就能看到有一些文本被高亮显示了,它们就是被选中的内容。

    三种可视模式

    v

    一个字符一个字符地选。从按下v的那个字符起,一直到光标所移动到的位置之间的内容都被选中。

    V

    一行一行地选。从按下V的那行起,一直到光标所移动到的行之间的所有行都被选中。

    Ctrl-v(可以用来删除一列和多列)

    它选中屏幕上的一个矩形区域。以按下Ctrl-v的位置为一个角,光标所在位置为它的对角。

    离开可视模式

    按下就会离开可视模式。

    可视模式下的编辑

    在可视模式下删除文本

    d

    删除所选中的部分。

    D

    删除所选中部分所在的行。即使没有把一行都选中,也把一行都删除。

    复制

    v

    复制选中的部分。

    D

    复制所选中部分所在行。即使没有把一行都选中,也把一行都复制。

    更改模式

    可以随时在可视模式中的三种之间切换,只需按进入想要切换到的模式的命令即可。

    更改文本

    c

    删除所选中的部分并切换到输入模式。

    C

    删除所选中的部分所在的行并切换到输入模式。

    合并行

    当选中想合并在一起的行以后,按下

    J(大写)

    就可以了。

    程序员的命令

    >

    所选中的部分都缩进一个tab。

    在所选中的部分删除一个tab的缩进。

    =

    自动排列所选中的内容。

    查看man

    K

    命令查看关键字的man page,在可视模式它会以选中的文本为关键字。

    可视块模式

    通过Ctrl-v进入的模式为可视块模式,它会选中一个矩形区域。

    插入内容

    I字符串

    会在每一行所选中内容的开始前添加”字符串”

    改变文本

    c字符串

    会把选中的内空删除并进入输入模式。你只需要在选中的第一行输入一个字符串,当按下后所有行的选中部分都会和第一行一样。这里的字符串中不能包含换行符,如果包含了换行符的话,它就不会这么神奇,就会根普通模式下的c一样了。

    C(大写)

    会直接删除到行尾,其它与c一样。

    A(大写)

    会在选中的块后面添加文本。它们是对齐的。

    如果要在选中的块紧接每行末尾添加内容,则需用$来指定选择到行尾,而不是简单地用光标。

    替换内容

    r

    用来把选中的内容替换成同一个字符。

    缩进

    >

    >将选中的块缩进一个shiftwidth

    留言

    Vim简明教程5:窗口

    九月 3, 2006 @ 9:17 am · 归类于 Vim

    打开一个新窗口

    最简单的打开新窗口的方法是

    :split

    它把一个窗口分成两个,光标留在上面的那个窗口中。

    通过

    Ctrl-w+方向键

    来在窗口间切换

    比如

    Ctrl-ww 或 Ctrl-w Ctrl-w

    切换到下一个窗口;

    Ctrl-wj 和 Ctrl-wk

    分别切换到下一个窗口和上一个窗口。

    要关闭窗口,用

    :q 或 ZZ 或 Ctrl-wc

    找开一个新窗口并在其中打开一个文件

    :split 文件名

    也可以给split命令分配一个初始命令,也就是说执行完split接着要做的

    :split +命令 文件名

    比如

    :split +/printf three.c

    命令会把当前窗口分成两个然后在上面的窗口中查找printf这个字符串。

    控制窗口大小

    如果给split命令指定一个参数,则表示新找开窗口的高度

    比如

    :3split alpha.c

    打开一个高度为3的窗口并在其中打开alpha.c

    :new命令

    :new

    命令用起来就跟split差不多,只有一点不同:new命令会在新窗口中新建一个文件,而split只是在新窗口中打开原窗口中的内容。

    分割并查看(Split and View)

    :sview

    命令新建一个窗口并且其中的内容是只读的。

    改变窗口大小

    行数Ctrl-w+

    把当前窗口高度增加”行数”行(如不指定行数,默认为1)

    行数Ctrl-w-

    把当前窗口高度减少”行数”行(如不指定行数,默认为1)

    Ctrl-w=

    让所有窗口一样高

    行数Ctrl-w_

    把当前窗口的高度设为”行数“,如不指定则把它最大化。

    缓冲

    Vim用缓冲来代表一个文件。当你在编缉一个文件时,只是在编缉它的缓冲。当你完成编辑保存时,Vim把缓冲中的内容保存进文件。当然,事情并不是 这么简单。在Vim中设置的标记之类的也保存在缓冲中。你可以同时拥有多个缓冲,当你编辑多个文件时就是这样。当你想要一个Vim窗口,并且想编辑多个文 件时,把这个窗口最大化是不管用的,因为这不是一个窗口,其它的窗口还是能看得见的。此时你可以把不编辑的缓冲隐藏(hide),用命令

    :hide

    一个缓冲有三种可能的状态:

    活动:显示在屏幕上的窗口

    隐藏:没有显示在屏幕上的在编辑的缓冲

    不活动:缓冲没有在编辑,但是保存着它的信息

    第三种状态需要多解释一下,当你编辑另一个文件时,当前文件的内容就没有用了。Vim就关掉它。但是它的一些其它信息可能还有用。(这一部分比较混乱,原文说得也不是很清楚,不懂也无所谓)

    要查看缓冲的列表,用

    :buffers

    命令。输出的第一列是缓冲编号,第二列是状态,第三列是与缓冲对应的文件。

    状态共且以下几种:

    - 不活动的缓冲
    h 隐藏的缓冲
    % 当前缓冲
    # 其它缓冲
    + 文件被编辑而未保存

    选择一个缓冲

    :buffer 缓冲编号

    如果你不知道缓冲的编号,可以用

    :buffer 文件名

    下面的命令分割窗品并编辑指定的缓冲

    :sbuffer 缓冲编号

    :sbuffer 文件名

    还有很多关于缓冲的命令:

    :bnext 去下一个缓冲
    :count bnext 执行count次去下一个缓冲
    :count sbnext 先分割窗口,然后执行:count bnext
    :count bprevious 去上一个缓冲。如果指定了count,则执行count次
    :count sbprevious 先分割窗口,然后执行:count bprevious
    :count bNext 同:count bprevious
    :count sbNext 同:count sbprevious
    :blast 去最后一个缓冲
    :sblast 先分割窗口再执行:blast
    :brewind 去第一个窗口
    :sbrewind 先分割窗口再执行:brewind
    :bmodified count 去第count个编辑过的缓冲
    :sbmodified count 等于:split加:bmodified

    缓冲选项

    通常当所有编辑一个文件的窗口都关掉后,这个窗口的缓冲就变成”不活动”,如果不想这样,可以设置

    :set hidden

    让它变成隐藏而不是不活动。

    通常分割/缓冲相关的命令会分割当前窗口,但是也可以让Vim在已经有窗口打开所指定的缓冲时,切换到那个窗口而不是新建一个:

    :set switchbuf=useopen

    更多关于switchbuf的内容参见23章。

    留言

    Vim简明教程4:块和多文件编辑

    九月 1, 2006 @ 11:04 am · 归类于 Vim

    这是我在看一本叫做Vim Tutorial的书时作的笔记,去掉了例子,作了一下总结。放上来作为一个Vim的小教程分享一下。本系列文章可转载,但请注明出处:http://mingfal.bloggerspaces.com

    剪切,粘贴和复制

    当你在删除文字的时候,比如d, x之类的,被删除的内容都被保存了下来。你可以通过

    p

    来粘贴它们。

    交换字符
    有时你会把两个字母打反,比如把the打成teh。用

    xp

    命令就可以把它们调换位置。原理是这样的,首先x会把e删除并保存,p会把它粘贴到光标所在位置,也就是h之后。

    关于粘贴的更多
    p命令可以用多次。p命令把内容粘贴在光标之后,而

    P

    把内容粘贴在光标之前。

    标记

    Vim允许你在文本中做标记。命令

    ma

    会在光标所在处做一个名为a的标记。你最多可以在文本中做26个标记(a-z)。

    要移动到一个标记,用命令

    `标记

    其中`是在键盘左上角数字一左边的那个键

    要移动到一个标记所在行的行首,用命令

    ‘标记

    其中‘是单引号

    标记在删除大量文件内容人时很有用。比如

    在你想要删除的文本的开始处做标记ma

    然后移动到想删除文本的末尾,用d`a删除从此位置到标记a间的内容。

    注意,标记会跟着它所标记处的文本移动(比如在它之前插入或删除了东西)

    标记都在哪呢?

    :marks

    命令会列出所有标记的列表。

    复制

    y

    命令用来复制,它的用法与d很相似。

    复制一行

    Y(大写)

    复制一行内容

    管道

    !动作 命令

    会把由”动作”选中的文本作为”命令”的输入,并用”命令”的输出替换选中的文本。

    举个例子,sort命令会对一个文件的内容排序。如果想对当前正在编辑文件的前10行排序,可以这样:

    先把光标移动到第一行,然后

    !10G sort

    !!命令

    命令把当前行作为“命令”的输入。(这是一个把系统命令的输出放到文件里的好方法)。

    编辑另一个文件

    :vi 或 :e

    可以关闭当前文件,并打开新的文件。

    如果当前文件没有保存,则会出现提示。这时使用

    :w

    会保存未保存的文件。

    View命令

    :view 文件

    会在Vim中以只读方式打开文件。

    处理多个文件

    可以在调用Vim时指定多个参数以依次编辑多个文件

    Vim 文件1 文件2 文件3 …

    默认情况下Vim每次只会编辑一个文件,当编辑完一个文件时,

    :next

    命令会关闭光前文件打开下个文件开始编辑。

    我在哪里
    当你在编辑多个文件时有时会忘了自己在编辑哪个。

    :args

    命令会显示当前正在编辑哪个文件。

    编辑上一个文件

    当要编辑上一个文件时,用命令

    :previous 或 :Next。

    编辑每一个或最后一个文件

    要编辑第一个文件,用

    :rewind

    要编辑最后一个文件,用

    :last

    编辑两个文件

    当同时编辑两个文件时,正在编辑的是当前文件,没在编辑的会被当成“另一个文件”,在这两个文件间切换要方便的多。用命令:

    Ctrl+^

    留言

    Vim简明教程3:查找

    九月 1, 2006 @ 10:55 am · 归类于 Vim

    这是我在看一本叫做Vim Tutorial的书时作的笔记,去掉了例子,作了一下总结。放上来作为一个Vim的小教程分享一下。本系列文章可转载,但请注明出处:http://mingfal.bloggerspaces.com

    简单查找

    /要查找内容

    用/向后查找,紧随其后的要查找的内容。然后按下回车,Vim就会去为你找你想要的东西了。

    要注意

    .*%/\?!$ 还有空格

    都有特殊意义,如果要查找的内容中包含这些字符,要在前面加上一个\。

    要查找区配的下一处,用命令

    \ 或 n

    它们的作用是相同的。

    查找历史

    查找命令可以允许你来查看查找的历史,在输入一个/以后,不要按回车,然后再按上下键就可以查看上一条或下一条查工历史了。在某个历史处如果按回车,就会查找此内容。

    查找选项

    高亮

    :set hlsearch

    命令可以让所有的查找都高亮显示匹配的部分。

    :set nohlsearch

    取消高亮选项

    增量查找

    一般情况下,Vim在查找时要等待用户输入整个要查找的内容,然后再去查找。增量查找则是不等用户输入完毕,就查找已输入的部分。要使用它需要进行下面设置:

    :set incsearch

    如查取消,则

    :set noincsearch

    反向查找

    ?要查找的内容

    命令从当前位置开始反向查找,即向文件的开始查找。

    改变方向

    N

    命令可以改变查找的方向并查找改变方向后的下一处匹配。

    基本的正则表达式

    行首(^)和行尾($)

    ^表示一行的开始,include会匹配每一处的include,而^include只会匹配在行首的include。
    $表示一行的结束,was$只会匹配在行末的was。
    如果想要匹配只有一个词the的行,用^the$。

    匹配任意单个字符(.)

    .匹配任一个字符,比如c.m表示以c开头以m结尾的有三个字母的字符串。

    匹配特殊字符

    好多字符在正则表达式中有特殊含意。要匹配这一类字符,要在前面加一个\。比如,要匹配the.,就要用the\.

    留言

    Vim简明教程2:编辑得更快一些

    八月 30, 2006 @ 12:43 pm · 归类于 Vim

    这是我在看一本叫做Vim Tutorial的书时作的笔记,去掉了例子,作了一下总结。放上来作为一个Vim的小教程分享一下。本系列文章可转载,但请注明出处:http://mingfal.bloggerspaces.com

    按词移动

    w

    按下w会前进一个词。

    b

    按下b会后退一个词。

    这里,就像在Vim中的大部分情况下一样,在这两个命令前面加上一个数字可以让它们重复做多次。

    移动到行首或行末

    $

    $会让你移动到所在行的末尾。

    ^

    ^会让你移动到所在行的开始。也可以做相似的事。不过^会移动到第一个非空的字符处,而会移动到行首。

    这两个命令也接受数字参数,比如

    2$

    会移动到下一行末。

    在行上查找

    f要查找的字符

    f用来在一行上查找一个字符并移动到该字符所在处。比如

    fx

    用来移动到此行当标后第一个x处。如果有一个数字参数,就可以指定移动到某个指定的匹配位置。

    F

    F用来向左查找。

    移动到指定行

    行号G

    G命令会把你带到用行号指定的行。如果使用没有行号的G,将会移动到最后一行。

    显示当前所在位置

    :set number

    Vim的可制定性是很强的,所以你可以通过:set设定很多选项。number就是其中之一。它是一个布尔选项,用来控制是否在最左边显示行号。

    :set number

    可以把它打开。

    :set nonumber

    则可以关闭此选项。

    Ctrl+g

    Ctrl+g会显示当然后在的位置。

    向上和向下翻屏

    Ctrl+u

    会向上翻半屏

    Ctrl+d

    会向下翻半屏

    删除文本

    dw

    dw会删除一个词。你应该可以看得出来,这里的w代表的就是word(词).其实d后面可以加好多东西来控制删除的对象。比如:

    d$

    会删除从当前位置到行末的所有内容。

    数字放在哪

    这里有一个疑问,如果想删除三个词,那么应该怎么办?是d3w,还是3dw。其实它们都能做到,不过原理不太一样。d3w是一次删除三个词,而3dw是执行三次删除一个词。其实这两者可以混起来,比如2d3w。

    改变文本

    c

    c用来改变文本。它的用法跟d一样。

    cc

    用来删除一行并进入输入状态。

    cw

    用来删除一个词并进入输入状态等。

    但是cw跟dw有一个不同之处。dw删除了一个词以后,还删除该词后面的空格。而cw只是会删除这个单词,空格仍然保留。

    .

    .命令会重复上一次所做的删除(d, x)或改变(c)命令。

    合并行

    J

    J(大写)将当下一行接在当前行后,并在两者间插入一个空格来合并这两行。

    替换字符

    r替换的字符

    r命令把当标处的字符替换成在r命令中指定的字符。

    更改大小写

    ~

    通过~可以把光标处的字符用它的大写(如果现在是小写)或小写(如果现在是大写)替换。

    Vim有着简洁而强大的宏功能。

    q宏名

    按下 q+宏名 后会进入宏录制状态,也就是说,此后发生的一切操作都会记录到名为“宏名”的宏中。如果名为“宏名”的宏已经存在,则将它覆盖。

    @宏名

    会调用名为“宏名”的宏。

    特殊字符

    当要输入特殊字符时,可以用

    Ctrl+k特殊字符代号

    可以通过命令

    :digraph

    来得到一个完整的对应表,来查看特殊符号所对应的代号。

    比如,要输入á, 则要通过下面的方法

    Ctrl+ka’

    留言

    Vim简明教程1:基本编辑

    八月 30, 2006 @ 12:37 pm · 归类于 Vim

    这是我在看一本叫做Vim Tutorial的书时作的笔记,去掉了例子,作了一下总结。放上来作为一个Vim的小教程分享一下。本系列文章可转载,但请注明出处:http://mingfal.bloggerspaces.com

    开始之前要做的

    touch ~/.Vimrc

    这会创建空的~/.Vimrc文件,这会告诉Vim你想要让Vim以Vim方式工作。如果不这样做的话,Vim会以Vi兼空模式运行,会有好多有用的功能没法使用。这也可以在Vim运行过程中通过

    :set nocompatible

    来实现。

    第一运行Vim

    gVim file.txt

    会运行gvim(Vim的图行化前端),并在其中打开file.txt文件

    Vim命令

    Vim

    会让你在终端打开Vim编辑,而不是像刚才那样打开一个新的窗口。

    模式

    Vim是一个模式化的编辑器。也就是说,它在不同的模式下会有不同的表现。当最下面的一行是文件名或为空时表示正在普通模式。如果是–INSERT–表示是在编辑模式。而–VISUAL–则表示目前是可视化模式。

    插入文本

    i

    键入i后会从普通模式转变到编辑模式。此时输入的东西将会作为文件的一部分。

    当你编辑完毕后,按下就会从编辑模式转回普通模式。同时,不管现在是在什么模式下,都会把你带回普通模式。

    移动光标

    当你回到命令模式(即普通模式)时,可以用下面的键来移动光标

    h(左), j(下), k(上), l(右)

    这可能看上去比较奇怪,谁会用l去表示右???但是实际上这是有原因的。移动光标上是在编辑过程中经常要做的,而h , j, k, l就在放右手手指的地方,也就是说按这几个键是最快的。当然,也可以用方向键来移动光标,不过那会大大减低你的编辑速度。

    删除字符

    x

    当你想删除一个字符时,把光标移动到它上面,然后按下x键,它就会消失。

    撤消和重做

    u

    在普通模式下按下u会撤消上一布的操作。

    Ctrl+R

    如果撤消的次数过多,按下 Ctrl+R 会重做上次撤消的操作。

    U

    U(大字)是一个特殊的撤消键,它会撤消在在最后编辑的行上所作的所有操作。

    退出

    ZZ

    ZZ会退出Vim并对所编辑的文件保存。

    取消修改

    :q!

    当你编辑完一个文件发现你并不想这样编辑它时,:q! 会让你退出Vim而不保存所作的修改。

    追加

    a

    i会在光标所在安符前插入字符,而a会让你在当标所在的位置之后继续输入内容。

    删除一行

    dd

    dd命令会删除当前所在的一行内容。

    新开始一行内容

    o

    o命令会在光标所在行下面加入一行,并将光标移动的此行的开始以供输入。

    O

    如果想在光标所在行的上面加入一行,请使用命令O(大写)

    获得帮助

    :help

    :help命令让你可以进入和查看Vim的帮助。用ZZ退出帮助。同时可以用像在Vim一样的h, j, k, l键来移动光标。帮助中会有一些被竖线括起来的词,那其实是超级链接。用Ctrl+]就可以跟随它,Ctrl+t用来后退。如果要查找某一特定主题的帮助,使用

    :help 主题

    同时

    也会起到和:help一样的效果。

    重复命令

    当要做多次同样的操作时,可以用计数来加快这一过程。

    9k

    会让你向上移动9行。通过在命令前加一个数字n,就可以执行这一命令n次。

    Vim教程

    Vim自带了一份Vim教程

    :vimtutor

    会打开它。

     

    展开全文
  • QTableWidget清空或删除内容及表头样式内容

    万次阅读 多人点赞 2018-02-01 12:08:05
    3、删除表格中的某行中的某列内容 4、删除表格中的某列内容 5、删除表格中的某行内容 6、删除表格中的某行和某 7、删除表格中的水平标题头 8、删除表格中的垂直标题头 9、设置该单元格为屏蔽状态,不能编辑...

    今天使用到了QTableWidget的清空和删除,特地整理出。如下:

    目录

    1、清空表格中所有内容

     2、清空表格中的内容(不包含表头)

    3、删除表格中的某行中的某列内容

    4、删除表格中的某列内容

    5、删除表格中的某行内容

    6、删除表格中的某行和某列

    7、删除表格中的水平标题头

    8、删除表格中的垂直标题头

    9、设置该单元格为屏蔽状态,不能编辑和选中

    10、取消表头的在选中单元格时的高亮状态

     11、QTableWidget设置为整行选中

    12、设置表头的样式

    13、删除QTableWidget自带的行号

    14、设置QTableWidget内容居中

    15、QTableWidget设置最后一列自动填充表格

    16、QTableWidget隐藏序号列

    17、QTableWidget设置最后一列自动填充表格

    18、QTableWidget设置水平表头

    19、在使用QTableWidget显示图片、文字等信息

    1、清空表格中所有内容

    void QTableWidget::clear() [slot] //清空表格中所有内容(包含表头)
    Removes all items in the view. This will also remove all selections and headers. 

     2、清空表格中的内容(不包含表头)

    void QTableWidget::clearContents() [slot] //清空表格中的内容(不包含表头)。
     Removes all items not in the headers from the view. This will also remove all selections. The table dimensions stay the same.

    3、删除表格中的某行中的某列内容

    void QTableWidget::removeCellWidget(int row, int column) //删除表格中的某行中的某列内容。
     Removes the widget set on the cell indicated by row and column.

    4、删除表格中的某列内容

    void QTableWidget::removeColumn(int column) [slot] //删除表格中的某列内容。
     Removes the column column and all its items from the table.

    5、删除表格中的某行内容

    void QTableWidget::removeRow(int row) [slot] //删除表格中的某行内容。
     Removes the row row and all its items from the table

    6、删除表格中的某行和某列

    QTableWidgetItem * QTableWidget::takeItem(int row, int column) //删除表格中的某行和某列
     Removes the item at row and column from the table without deleting it.

    7、删除表格中的水平标题头

    QTableWidgetItem * QTableWidget::takeHorizontalHeaderItem(int column) //删除表格中的水平标题头
     Removes the horizontal header item at column from the header without deleting it.

    8、删除表格中的垂直标题头

    QTableWidgetItem * QTableWidget::takeVerticalHeaderItem(int row) //删除表格中的垂直标题头
     Removes the vertical header item at row from the header without deleting it.

    9、设置该单元格为屏蔽状态,不能编辑和选中

    ui->tableWidget->item(0,0)->setFlags(Qt::ItemIsEditable);//设置该单元格为屏蔽状态,不能编辑和选中。 

    10、取消表头的在选中单元格时的高亮状态

    ui->tableWidget->horizontalHeader()->setHighlightSections(false);//取消表头的在选中单元格时的高亮状态。

     11、QTableWidget设置为整行选中

    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);

    12、设置表头的样式

    ui->tableWidget->horizontalHeader()->setStyleSheet(“image: url(:/img/a.png);image-position:left; “); //设置表头的样式。 

    13、删除QTableWidget自带的行号

    QHeaderView* headerView = ui->tableWidget->verticalHeader();//m_ItemTable为QTableWidget
    headerView->setHidden(true);//隐藏tablewidget自带行号列

    14、设置QTableWidget内容居中

    QTableWidgetItem *item;
    item = new QTableWidgetItem;
    item->setText(userInfo.userId);
    item->setTextAlignment(Qt::AlignCenter);//设置内容对齐方式为垂直和水平居中
    ui->tableWidget->setItem(i, 0, item);

    15、QTableWidget设置最后一列自动填充表格

    ui->tableWidget->horizontalHeader()->setStretchLastSection(true); 

    16、QTableWidget隐藏序号列

    QHeaderView* headerView = m_ItemTable->verticalHeader();//隐藏序号列
    headerView->setHidden(true);

    17、QTableWidget设置最后一列自动填充表格

    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);   //设置最后一列自动填充表格
    ui->tableWidget->horizontalHeader()->setResizeContentsPrecision(QHeaderView::Stretch);

    18、QTableWidget设置水平表头

    QStringList header;
    header<<"节目编号"<<"节目名称"<<"开始时间"<<"结束时间"<<"创建者"<<"创建时间"<<"审核"<<"备注";
    ui->tableWidget->setHorizontalHeaderLabels(header); //设置水平表头
    ui->tableWidget->setColumnWidth(1, 200);//设置第一列宽度

    19、在使用QTableWidget显示图片、文字等信息

    在使用QTableWidget显示图片、文字等信息的时候,有时会遇到这样一种情况:图片或者文字没有填满一整行或一整列。余下的几项是空白的单元格,白占着位置,最关键的是这些Item还可以被选中,在选中项被设成高亮显示的时候就十分的难看,显得很不和谐。如何设置这些空白的单元格,使其看起来就像背景的白板一样呢?

        下面提供解决办法:

    1)、首先空白的单元格要填入一个QTableWidgetItem,这是必要的,因为我们要针对某一个Item操作,而不是QTableWidget。

    2)、通过设置flag,设置Item的属性:使其不可用或者不可选中、不可编辑。

    Qt提供了一个函数(setFlags(Qt::ItemFlags))和一些枚举值来设置这些属性。

    使用方法如下:

    QTableWidgetItem *item = new QTableWidgetItem();
    tabWidget->setItem(2,0,item);
    item->setFlags(item->flags() & ~Qt::ItemIsEnabled & ~Qt::ItemIsSelectable);

    上面用到的两个枚举中:~Qt::ItemIsEnabled可以保证单击该Item时不会被选中,但是在启用Ctrl + A时,全选操作会导致Item被选中。~Qt::ItemIsSelectable的使用可以保证全选状态下也不会被选中,但是在单独使用时出现了虚线框,没有真正实现“不存在”的效果。所以必须两个同用。

    展开全文
  • DataFrame删除行、

    千次阅读 2018-06-03 14:57:42
    我们需要删除某一所有元素中含有固定字符元素所在的行,比如下面的例子: 如果要删除的元素固定有更简单的方法,可参考另一篇博文:http://blog.csdn.net/htbeker/article/details/79427628...
  • 1、如果这张表没有主键(或者相同的行并没有不相同的内容列),则需要新建一个自增列,用来区分不同列。例如 代码如下: alter table [tablename] add [TID] int IDENTITY(1,1) 就是增加一个自增量的临时列TID。 为啥...
  • 删除指定 df.drop(['typeMedium'],axis=1,inplace=True) 将header为’typeMedium’的列删除 8. 名称重命名 df.rename(columns={'hah':'typeBig','typeBig':'typeMedium','typeMedium':'typeSmall','typeSmall':...
  • 暂时只实现了删除中的空行,并没有实现多行的判断空行和删除方法。----之后再做更复杂的 1.1需求分析 用VBA删除如下内容,解决思路都不同 删除1的空行(本文要做的) 删除整个区域内的空行 删除整个...
  • excel 如何为添加指定内容(字符串) CreateTime--2018年5月26日17:52:32 Author:Marydon 1.情景展示  D的值需要获取B的值并且在后面统一加上123 2.实现  语法说明:  通过&amp;符号来拼接字符...
  • python pandas 在dataframe中增加或删除行或

    万次阅读 多人点赞 2019-04-12 17:30:35
    在dataframe中增加或删除行或 首先构建一个dataframe import pandas as pd d={'one':{'a':1,'b':2,'c':3},'two':{'a':4,'b':5,'c':6},'three':{'a':7,'b':8,'c':9}} df=pd.DataFrame(d) print(df) 构建的...
  • pyqt中的qtableWidge用法总结(获取行数、数、指针、内容等)持续更新~ qtableWidge中的行和是从0开始的 *************** self.tableWidget.itemClicked.connect(self.outSelect)#单击获取单元格中的内容 def ...
  • word宏 批量删除含有关键字的表格

    千次阅读 2019-10-03 22:42:02
    工作中,由于每次修改word文档,都需要进行繁琐的修改,删除多余的或者调节表格的宽度。 使用word宏编程的方式对word文档进行对应的操作。 宏: 1 Sub del_key() 2 Dim str As String 3 Dim table_...
  • js实现动态删除表格行和

    万次阅读 2015-08-18 11:10:58
    记录了动态添加表格的一行,当然这个一行是指一行数据,也就是说一行多少也是加上的,并且第几列的内容都可以添加上,先来回顾下它的实现的关键点: 1、var row=table.insertRow();添加一行; 2、var cell1=...
  • pandas删除某些、行总结

    千次阅读 2019-07-26 11:39:46
    df.drop(df.columns[[0, 2]], axis=1, inplace=True) # 删除第1第3 3,增加行 3.1,loc,at,set_value 想增加一行,行名称为‘5’,内容为[16, 17, 18, 19] df.loc['5'] = [16, 17, 18, 19]...
  • SQL中将一的多行内容拼接成一行

    千次阅读 2015-06-28 16:09:06
    昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个的多行内容拼接成一行,比如表中有两列数据 : 类别 名称 AAA 企业1 AAA 企业2 ...
  • 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个的多行内容拼接成一行 比如表中有两列数据 : ep_classes&nbsp;&nbsp;ep_name AAA&nbsp;&...
  • mysql数据库表中删除某一值重复的全部行和只留一条 原创 2013年10月16日 00:29:34 4473 (1)mysql 数据库中删除某一值重复的全部行(一个笔试题) 如果要求是多个字段重复的...
  • 13_Numpy数组(ndarray)中含有缺失值(nan)行和删除方法 要删除NumPy数组ndarray中包含缺失值NaN的行或,可以使用np.isnan()确定缺失值,使用any()或all()提取不含缺失值行和。 在此,将对以下进行说明...
  • excel 删除重复行数据,数据

    千次阅读 2012-07-30 11:52:50
    大家在使用Excel表格总汇大批量数据时,难免会发现一些重复行和重复数据,这时我们就应该将那些重复的数据删除,以免会影响我们的工作,在Excel中删除重复数据和重复行的方法有N多,下面Word联盟(www.wordlm.com)...
  • Oracle 行转 动态出转换的

    万次阅读 多人点赞 2018-10-02 13:03:23
    10月的第二天,前天写了个Oracle中行转的pivot的基本使用方法,然后,因为pivot的用法中,正常情况下,我们需要转出多少个,都得在我们的sql中完完整整地写出,而不能直接在里面写个查询来动态转换。然后,趁着...
  • 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个的多行内容拼接成一行 比如表中有两列数据 : ep_classes ep_name AAA 企业1 AAA 企业2 ...
  • Excel 中如何根据单元格内容删除

    万次阅读 2018-10-29 18:15:33
    根据单元格内容快速删除行,首先需要选中含有该单元格内容的所有行,然后删除。似乎在 Excel 当中除了 VBA 以外没有其他更快捷的方法能解决这个问题了。这里将推荐几个快速根据单元格内容删除行的方法给你。 通过...
  • 一开始以为是自己程序写的有问题,于是在数据保存和数据读取的时候分别下断点,然后查看字符串长度,结果发现,保存到数据库之前,字符串最后的空格还存在,但从数据库中读出来之后最后的空格就没有了。 我们的...
  • 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个的多行内容拼接成一行 比如表中有两列数据 : ep_classes ep_name AAA 企业1 ...
  • excel将B数据放在A后面

    千次阅读 2020-04-01 15:20:57
    我现在有这样的一张表 第一姓名第二学号如下: 想将除ab其他数据都放到ab下: 首先第一步,在a的后面写公式接上c的第一个选中A9行的右下角鼠标变成‘+...之后删除ab以为的数据即可 最后进行筛选下...
  • IDEA操作

    千次阅读 2019-05-21 07:18:06
    但有时候的我们的内容没有共同特征,这时可以先选中内容,再按快捷键Shift+Alt+Insert,也可以进行操作,效果如图: 下面是一个更详细的操作编辑示例: 把一个Json状态码转为枚举类,原始的json状态码如下: ...
  • 在SQL中怎么删除的语法是什么

    千次阅读 2008-10-20 09:27:00
    你试一下 A B C1 b1 c12 b2 c2delete from test where A =‘1’ delete from test where A =‘(你要删除列的主键字段的值)’ 答案补充不好意思哦 假设表test中 A列位主键字段 )|||Alter table test Drop column B...
  • 删除所有表格的哪一?注意,删除后无法撤销。")If IsNumeric(intCol) Then for i=1 to Tables.Count Tables(i).Columns(intCol).Delete NextElse MsgBox("输入数据应为数值...
  • Easyui 动态改变

    万次阅读 2017-12-25 19:35:16
    Easyui 动态改变,刷新头,保留屏蔽层

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 551,776
精华内容 220,710
关键字:

删除没有内容的列